Showing preview only (907K chars total). Download the full file or copy to clipboard to get everything.
Repository: mr-smithers-excellent/docker-build-push
Branch: master
Commit: 96b479519bda
Files: 31
Total size: 880.2 KB
Directory structure:
gitextract_9_mypmei/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── dependabot.yml
│ ├── e2e.yml
│ ├── nightly-e2e.yml
│ ├── ok-to-test.yml
│ ├── pr-e2e.yml
│ ├── pr.yml
│ └── release.yml
├── .gitignore
├── .npmrc
├── .prettierrc
├── LICENSE
├── README.md
├── action.yml
├── dist/
│ ├── index.js
│ └── package.json
├── e2e/
│ ├── Dockerfile
│ ├── multi.Dockerfile
│ └── test-build-dir/
│ └── Dockerfile
├── eslint.config.js
├── package.json
├── src/
│ ├── docker-build-push.js
│ ├── docker.js
│ ├── github.js
│ ├── main.js
│ └── utils.js
└── tests/
├── docker-build-push.test.js
├── docker.test.js
├── github.test.js
└── utils.test.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
open-pull-requests-limit: 10
target-branch: 'master'
================================================
FILE: .github/workflows/ci.yml
================================================
name: 'Unit Tests'
on: [push]
permissions:
contents: read
id-token: write
jobs:
run-tests:
if: ${{ github.actor != 'dependabot[bot]' }}
name: Unit Tests
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 20
- name: Build
run: npm ci
- name: Run tests
run: npm run test
- name: Submit coverage report
uses: qltysh/qlty-action/coverage@v2
with:
oidc: true
files: coverage/lcov.info
dependabot-tests:
if: ${{ github.actor == 'dependabot[bot]' }}
name: Dependabot Unit Tests
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 20
- name: Build
run: npm ci
- name: Run tests
run: npm run test
================================================
FILE: .github/workflows/dependabot.yml
================================================
name: Dependabot
on:
pull_request_target:
types: [opened, synchronize, reopened]
permissions:
contents: write
pull-requests: write
jobs:
unit-tests:
if: ${{ github.actor == 'dependabot[bot]' }}
name: Unit Tests
runs-on: ubuntu-latest
steps:
- name: Check out PR code
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: actions/setup-node@v6
with:
node-version: 20
- name: Build
run: npm ci
- name: Run unit tests
run: npm run test
- name: Check dist is up-to-date
run: |
npm run build
git add dist/
git diff --staged --exit-code || (echo "❌ dist/ is not up-to-date. Please run 'npm run build' and commit the changes." && exit 1)
auto-merge:
needs: [unit-tests]
if: ${{ github.actor == 'dependabot[bot]' }}
runs-on: ubuntu-latest
steps:
- name: Enable auto-merge
run: gh pr merge --auto --merge "${{ github.event.pull_request.html_url }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/e2e.yml
================================================
name: 'e2e Tests'
on:
workflow_call:
inputs:
pr-trigger:
description: 'True if tests were triggered by a PR'
default: false
required: true
type: boolean
ref:
description: 'Git ref to check out (used when pr-trigger is false)'
default: ''
required: false
type: string
jobs:
e2e:
name: ${{ matrix.name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- name: Docker Hub e2e
image: mrsmithers/hello-world
dockerfile: ./e2e/Dockerfile
registry: docker.io
username: DOCKERHUB_USERNAME
password: DOCKERHUB_PASSWORD
addLatest: true
labels: org.opencontainers.image.description="A Hello World image used for e2e tests"
- name: Multi-platform e2e
image: mrsmithers/hello-world
dockerfile: ./e2e/Dockerfile
registry: docker.io
username: DOCKERHUB_USERNAME
password: DOCKERHUB_PASSWORD
multiPlatform: true
platform: linux/amd64,linux/arm64,linux/arm/v7
- name: GAR e2e
imageSecret: GAR_IMAGE
dockerfile: ./e2e/Dockerfile
registrySecret: GAR_REGISTRY
username: GAR_USERNAME
password: GAR_PASSWORD
labels: org.opencontainers.image.description="A Hello World image used for e2e tests"
- name: ECR e2e
image: hello-world
dockerfile: ./e2e/test-build-dir/Dockerfile
directory: e2e/test-build-dir
registry: 026181534292.dkr.ecr.us-west-2.amazonaws.com
buildArgs: TEST=true
- name: ACR e2e
image: hello-world
dockerfile: ./e2e/Dockerfile
registrySecret: ACR_REGISTRY
username: ACR_USERNAME
password: ACR_PASSWORD
- name: GHCR Legacy e2e
image: docker-build-push/e2e-image
dockerfile: ./e2e/Dockerfile
registry: docker.pkg.github.com
username: GH_USERNAME
password: GITHUB_TOKEN
- name: GHCR e2e
image: hello-world
dockerfile: ./e2e/multi.Dockerfile
target: prod
registry: ghcr.io
githubOrg: docker-action-e2e
username: GHCR_USERNAME
password: GHCR_TOKEN
steps:
- name: Check out code current branch
if: ${{ !inputs.pr-trigger }}
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.sha }}
- name: Check out merge code
if: ${{ inputs.pr-trigger }}
uses: actions/checkout@v6
with:
ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge'
- name: Create check run
if: ${{ inputs.pr-trigger }}
uses: actions/github-script@v9
env:
name: ${{ matrix.name }}
number: ${{ github.event.client_payload.pull_request.number }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: pull } = await github.rest.pulls.get({
...context.repo,
pull_number: process.env.number
});
const sha = pull.head.sha;
const { data: check } = await github.rest.checks.create({
...context.repo,
name: process.env.name,
head_sha: sha
});
return check;
- name: Resolve registry and image
id: resolve
env:
REGISTRY_SECRET: ${{ matrix.registrySecret && secrets[matrix.registrySecret] || '' }}
IMAGE_SECRET: ${{ matrix.imageSecret && secrets[matrix.imageSecret] || '' }}
run: |
REGISTRY="${REGISTRY_SECRET:-${{ matrix.registry }}}"
IMAGE="${IMAGE_SECRET:-${{ matrix.image }}}"
if [ -z "$REGISTRY" ] || [ -z "$IMAGE" ]; then
echo "configured=false" >> $GITHUB_OUTPUT
else
echo "configured=true" >> $GITHUB_OUTPUT
echo "registry=$REGISTRY" >> $GITHUB_OUTPUT
echo "image=$IMAGE" >> $GITHUB_OUTPUT
fi
- name: Build and push Docker image
id: docker
if: steps.resolve.outputs.configured == 'true'
uses: ./
with:
image: ${{ steps.resolve.outputs.image }}
tags: ${{ github.run_id }}
addLatest: ${{ matrix.addLatest }}
addTimestamp: ${{ matrix.addTimestamp }}
registry: ${{ steps.resolve.outputs.registry }}
dockerfile: ${{ matrix.dockerfile }}
directory: ${{ matrix.directory }}
buildArgs: ${{ matrix.buildArgs }}
labels: ${{ matrix.labels }}
target: ${{ matrix.target }}
username: ${{ secrets[matrix.username] }}
password: ${{ secrets[matrix.password] }}
githubOrg: ${{ matrix.githubOrg }}
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Verify Docker image
if: steps.resolve.outputs.configured == 'true'
run: |
docker pull ${{ steps.docker.outputs.imageFullName }}:${{ github.run_id }}
docker image inspect ${{ steps.docker.outputs.imageFullName }}:${{ github.run_id }}
- name: Update check run
if: ${{ inputs.pr-trigger && always() }}
uses: actions/github-script@v9
env:
number: ${{ github.event.client_payload.pull_request.number }}
job: ${{ github.job }}
conclusion: ${{ job.status }}
name: ${{ matrix.name }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: pull } = await github.rest.pulls.get({
...context.repo,
pull_number: process.env.number
});
const ref = pull.head.sha;
const { data: checks } = await github.rest.checks.listForRef({
...context.repo,
ref
});
const check = checks.check_runs.filter(c => c.name === process.env.name);
const { data: result } = await github.rest.checks.update({
...context.repo,
check_run_id: check[0].id,
status: 'completed',
conclusion: process.env.conclusion
});
return result;
- name: Dump context
if: always()
uses: crazy-max/ghaction-dump-context@v2
================================================
FILE: .github/workflows/nightly-e2e.yml
================================================
name: 'Nightly e2e Tests'
on:
schedule:
- cron: '0 8 * * *' # everyday at 8am UTC
jobs:
e2e:
uses: ./.github/workflows/e2e.yml
secrets: inherit
with:
pr-trigger: false
================================================
FILE: .github/workflows/ok-to-test.yml
================================================
name: Ok To Test
on:
workflow_dispatch:
jobs:
ok-to-test:
runs-on: ubuntu-latest
if: false
steps:
- name: Generate token
id: generate_token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }}
- name: Slash Command Dispatch
uses: peter-evans/slash-command-dispatch@v3
env:
TOKEN: ${{ steps.generate_token.outputs.token }}
with:
token: ${{ env.TOKEN }}
reaction-token: ${{ secrets.GITHUB_TOKEN }}
issue-type: pull-request
commands: ok-to-test
named-args: true
permission: write
================================================
FILE: .github/workflows/pr-e2e.yml
================================================
name: 'PR e2e Tests'
on:
pull_request_target:
types: [opened, synchronize, reopened]
jobs:
e2e:
uses: ./.github/workflows/e2e.yml
secrets: inherit
with:
pr-trigger: false
ref: ${{ github.event.pull_request.head.sha }}
================================================
FILE: .github/workflows/pr.yml
================================================
name: 'Pull Request'
on: [pull_request]
jobs:
run-tests:
if: ${{ github.actor != 'dependabot[bot]' }}
name: Unit Tests
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 20
- name: Build
run: npm ci
- name: Run unit tests
run: npm run test
- name: Check dist is up-to-date
run: |
npm run build
git add dist/
git diff --staged --exit-code || (echo "❌ dist/ is not up-to-date. Please run 'npm run build' and commit the changes." && exit 1)
================================================
FILE: .github/workflows/release.yml
================================================
name: 'Release'
on:
push:
tags:
- 'v*'
jobs:
release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Check dist is up-to-date
run: |
git add dist/
git diff --staged --exit-code || (echo "❌ dist/ is not up-to-date. Please run 'npm run build' and commit the changes before creating a release." && exit 1)
- name: Extract version from tag
id: version
run: |
echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
echo "major=$(echo ${GITHUB_REF#refs/tags/v} | cut -d. -f1)" >> $GITHUB_OUTPUT
- name: Generate release notes
id: notes
uses: actions/github-script@v9
with:
script: |
const { data: releases } = await github.rest.repos.listReleases({
...context.repo,
per_page: 1
});
const previousTag = releases.length > 0 ? releases[0].tag_name : null;
const currentTag = '${{ steps.version.outputs.tag }}';
let compareUrl = '';
let commits = [];
if (previousTag) {
compareUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/compare/${previousTag}...${currentTag}`;
const { data: comparison } = await github.rest.repos.compareCommits({
...context.repo,
base: previousTag,
head: currentTag
});
commits = comparison.commits;
} else {
const { data: recentCommits } = await github.rest.repos.listCommits({
...context.repo,
per_page: 10
});
commits = recentCommits;
}
let releaseNotes = `## What's Changed\n\n`;
for (const commit of commits) {
const message = commit.commit.message.split('\n')[0];
const author = commit.author ? commit.author.login : commit.commit.author.name;
const sha = commit.sha.substring(0, 7);
releaseNotes += `* ${message} (${sha}) @${author}\n`;
}
if (previousTag) {
releaseNotes += `\n**Full Changelog**: ${compareUrl}`;
}
return releaseNotes;
- name: Create Release
uses: actions/github-script@v9
with:
script: |
const { data: release } = await github.rest.repos.createRelease({
...context.repo,
tag_name: '${{ steps.version.outputs.tag }}',
name: '${{ steps.version.outputs.tag }}',
body: `${{ steps.notes.outputs.result }}`,
make_latest: 'true'
});
console.log(`Created release: ${release.html_url}`);
- name: Update major version tag
run: |
MAJOR_TAG="v${{ steps.version.outputs.major }}"
echo "Updating major version tag: $MAJOR_TAG"
# Check if major version tag exists
if git ls-remote --tags origin | grep -q "refs/tags/$MAJOR_TAG$"; then
echo "Major version tag $MAJOR_TAG exists, updating it"
git tag -f $MAJOR_TAG ${{ steps.version.outputs.tag }}
git push origin $MAJOR_TAG --force
else
echo "Major version tag $MAJOR_TAG does not exist, creating it"
git tag $MAJOR_TAG ${{ steps.version.outputs.tag }}
git push origin $MAJOR_TAG
fi
================================================
FILE: .gitignore
================================================
# comment this out distribution branches
node_modules/
# Editors
.vscode
.idea
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Other Dependency directories
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# next.js build output
.next
# Allure
allure-report
allure-results
# husky
.husky
================================================
FILE: .npmrc
================================================
legacy-peer-deps=true
================================================
FILE: .prettierrc
================================================
{
"arrowParens": "avoid"
}
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2019 Sean Smith
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Docker Build & Push Action
[](https://github.com/mr-smithers-excellent/docker-build-push/actions/workflows/ci.yml)
[](https://github.com/mr-smithers-excellent/docker-build-push/actions/workflows/nightly-e2e.yml)
[](https://qlty.sh/gh/mr-smithers-excellent/projects/docker-build-push)
[](https://qlty.sh/gh/mr-smithers-excellent/projects/docker-build-push)
Builds a Docker image and pushes it to the private registry of your choosing.
## Supported Docker registries
- Docker Hub
- Google Container Registry (GCR)
- Google Artifact Registry (GAR)
- AWS Elastic Container Registry (ECR)
- Azure Container Registry (ACR)
- GitHub Docker Registry
- JFrog Artifactory
## Features
- [Auto-tagging with GitOps](#auto-tagging-with-gitops)
- [BuildKit support](#buildkit-support)
- [Multi-platform builds](#multi-platform-builds)
## Breaking changes
If you're experiencing issues, be sure you are using the [latest stable release](https://github.com/mr-smithers-excellent/docker-build-push/releases/latest) (currently `v6`).
### v6
- Multi-platform builds now supported
- SSH agent forwarding
### v5
- AWS ECR [get-login command](https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html) became deprecated, migrated to [get-login-password command](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)
- Support for multiple tags added
- BuildKit support added
## Basic usage
- Ensure you run the [checkout action](https://github.com/actions/checkout) before using this action
- Add the following to a workflow `.yml` file in the `/.github` directory of your repo
```yaml
steps:
- uses: actions/checkout@v3
name: Check out code
- uses: mr-smithers-excellent/docker-build-push@v6
name: Build & push Docker image
with:
image: repo/image
tags: v1, latest
registry: registry-url.io
dockerfile: Dockerfile.ci
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
```
## Inputs
| Name | Description | Required | Type |
|----------------|----------------------------------------------------------------------------------------------------------|----------|---------|
| image | Docker image name | Yes | String |
| tags | Comma separated docker image tags (see [Auto-tagging with GitOps](#auto-tagging-with-gitops)) | No | List |
| appendMode | Append tags to auto-generated GitOps tags instead of replacing them | No | Boolean |
| addLatest | Adds the `latest` tag to the GitOps-generated tags | No | Boolean |
| addTimestamp | Suffixes a build timestamp to the branch-based Docker tag | No | Boolean |
| registry | Docker registry host | Yes | String |
| dockerfile | Location of Dockerfile (defaults to `Dockerfile`) | No | String |
| directory | Directory to pass to `docker build` command, if not project root | No | String |
| buildArgs | Docker build arguments passed via `--build-arg` | No | List |
| labels | Docker build labels passed via `--label` | No | List |
| target | Docker build target passed via `--target` | No | String |
| platform | Docker build platform passed via `--platform` | No | String |
| secrets | Docker build secrets passed via `--secret` (e.g. `id=mysecret,src=secret.txt`). Requires BuildKit. | No | List |
| username | Docker registry username | No | String |
| password | Docker registry password or token | No | String |
| githubOrg | GitHub organization to push image to (if not current) | No | String |
| enableBuildKit | Enables Docker BuildKit support | No | Boolean |
| cacheFrom | Docker cache source passed via `--cache-from` (e.g. `type=gha` or `type=registry,ref=myimage:cache`). Requires `enableBuildKit: true` for advanced cache types. | No | String |
| cacheTo | Docker cache destination passed via `--cache-to` (e.g. `type=gha,mode=max`). Requires `enableBuildKit: true`. | No | String |
| multiPlatform | Enables Docker buildx support | No | Boolean |
| overrideDriver | Disables setting up docker-container driver (if `true`, alternative docker driver must be set up) | No | Boolean |
| skipLogin | Skip the Docker login step, useful when credentials are pre-configured via a credential helper or OIDC | No | Boolean |
| pushImage | Flag for disabling the push step, set to `true` by default | No | Boolean |
## Outputs
| Name | Description | Format |
|---------------|----------------------------------------------------|------------------------|
| imageFullName | Full name of the Docker image with registry prefix | `registry/owner/image` |
| imageName | Name of the Docker image with owner prefix | `owner/image` |
| tags | Tags for the Docker image | `v1,latest` |
## Storing secrets
It is strongly recommended that you store all Docker credentials as GitHub [encrypted secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets). Secrets can be referenced in workflow files using the syntax `${{ secrets.SECRET_NAME }}`.
There is a distinction between secrets at the [repository](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository), [environment](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-an-environment) and [organization](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-an-organization) level. In general, you should store secrets at the repository or organization level, depending on your security posture. It is only recommended that you utilize environment-level secrets if your Docker credentials differ per environment (dev, staging, etc.).
## Examples
### Docker Hub
- Save your Docker Hub username (`DOCKER_USERNAME`) and password (`DOCKER_PASSWORD`) as secrets in your GitHub repo
- Modify sample below and include in your workflow `.github/workflows/*.yml` file
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: docker-hub-repo/image-name
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
```
### Google Container Registry (GCR)
- Create a service account with the ability to push to GCR (see [configuring access control](https://cloud.google.com/container-registry/docs/access-control))
- Create and download JSON key for new service account
- Save content of `.json` file as a secret called `DOCKER_PASSWORD` in your GitHub repo
- Modify sample below and include in your workflow `.github/workflows/*.yml` file
- Ensure you set the username to `_json_key`
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: gcp-project/image-name
registry: gcr.io
username: _json_key
password: ${{ secrets.DOCKER_PASSWORD }}
```
### Google Artifact Registry (GAR)
- Create a Docker repository in GAR (see [quickstart](https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling))
- Create a service account with the **Artifact Registry Writer** role (`roles/artifactregistry.writer`)
- Create and download a JSON key for the service account (**IAM & Admin → Service Accounts → Keys → Add Key → JSON**)
- Save the following as secrets in your GitHub repo:
- `GAR_REGISTRY`: your registry host, e.g. `us-west1-docker.pkg.dev`
- `GAR_PASSWORD`: the full contents of the downloaded JSON key file
- Modify sample below and include in your workflow `.github/workflows/*.yml` file
- Set the username to `_json_key` when authenticating with a JSON key
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: project-id/repository/image-name
registry: ${{ secrets.GAR_REGISTRY }}
username: _json_key
password: ${{ secrets.GAR_PASSWORD }}
```
### AWS Elastic Container Registry (ECR)
- Create an IAM user with the ability to push to ECR (see [example policies](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr_managed_policies.html))
- Create and download access keys
- Save `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` as secrets in your GitHub repo
- Ensure the repo you are trying to push to already exists, if not create with `aws ecr create-repository` before pushing
- Modify sample below and include in your workflow `.github/workflows/*.yml` file
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: image-name
registry: [aws-account-number].dkr.ecr.[region].amazonaws.com
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
```
### Azure Container Registry (ACR)
- Create an Azure Container Registry (see [quickstart](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal))
- Enable the **Admin user** under your registry's **Settings → Access keys**
- Save the following as secrets in your GitHub repo:
- `ACR_REGISTRY`: your login server, e.g. `yourname.azurecr.io`
- `ACR_USERNAME`: the admin username (same as registry name)
- `ACR_PASSWORD`: one of the generated passwords
- Modify sample below and include in your workflow `.github/workflows/*.yml` file
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: image-name
registry: ${{ secrets.ACR_REGISTRY }}
username: ${{ secrets.ACR_USERNAME }}
password: ${{ secrets.ACR_PASSWORD }}
```
### GitHub Container Registry
- GitHub recently [migrated their container registry](https://docs.github.com/en/packages/guides/migrating-to-github-container-registry-for-docker-images) from docker.pkg.github.com to ghcr.io
- It is assumed you'll be pushing the image to a repo inside your GitHub organization, unless you set `githubOrg`
- If using ghcr.io, provide the image name in `ghcr.io/OWNER/IMAGE_NAME` format
- If using docker.pkg.github.com, provide the image name in `docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME` format
- Provide either the `${{ github.actor }}` or an alternate username for Docker login (with associated token below)
- Pass the default GitHub Actions token or custom secret with [proper push permissions](https://docs.github.com/en/packages/guides/pushing-and-pulling-docker-images#authenticating-to-github-container-registry)
#### New ghcr.io
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: image-name
registry: ghcr.io
githubOrg: override-org # optional
username: ${{ secrets.GHCR_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }}
```
#### Legacy docker.pkg.github.com
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: github-repo/image-name
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
```
### JFrog Artifactory
- Create a Docker repository in Artifactory (see [getting started](https://jfrog.com/help/r/jfrog-artifactory-documentation/getting-started-with-artifactory-as-a-docker-registry))
- Generate an [API key or identity token](https://jfrog.com/help/r/jfrog-platform-administration-documentation/user-profile) for authentication
- Save the following as secrets in your GitHub repo:
- `JFROG_REGISTRY`: your Artifactory Docker registry host, e.g. `<instance>.jfrog.io` (cloud) or `<hostname>:<port>` (self-hosted)
- `JFROG_USERNAME`: your Artifactory username
- `JFROG_PASSWORD`: your Artifactory API key or identity token
- The image path must include the repository name: `<docker-repo>/<image-name>`
- Modify sample below and include in your workflow `.github/workflows/*.yml` file
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: docker-repo/image-name
registry: ${{ secrets.JFROG_REGISTRY }}
username: ${{ secrets.JFROG_USERNAME }}
password: ${{ secrets.JFROG_PASSWORD }}
```
## Contributing
### Prerequisites
- [Node.js](https://nodejs.org/) v20 or higher
- npm v8 or higher
### Setup
```bash
git clone https://github.com/mr-smithers-excellent/docker-build-push.git
cd docker-build-push
npm install
```
> **Note:** `eslint-config-airbnb-base` and `eslint-plugin-import` have not yet formally declared ESLint 10 peer dependency support. A `.npmrc` file in this repo sets `legacy-peer-deps=true` to allow installation without errors. This flag is automatically applied — no extra flags are needed when running `npm install` or `npm ci`.
### Scripts
| Command | Description |
|---|---|
| `npm test` | Runs ESLint then the full Jest test suite with coverage |
| `npm run test:watch` | Runs tests in watch mode |
| `npm run lint` | Runs ESLint with auto-fix on `src/` and `tests/` |
| `npm run build` | Bundles `src/main.js` into `dist/index.js` via esbuild |
### Building locally
The action runs from the pre-built `dist/index.js` bundle (committed to the repo). After making changes to any file in `src/`, rebuild before committing:
```bash
npm run build
```
A [Husky](https://typicode.com/husky) pre-commit hook runs `npm run build` automatically and stages the updated `dist/` for you, so in normal development you don't need to run this manually.
### Testing
```bash
npm test
```
This runs ESLint across `src/` and `tests/`, then Jest with coverage. All 4 test suites must pass before a PR will be accepted.
---
## Auto-tagging with GitOps
By default, if you do not pass a `tags` input this action will use an algorithm based on the state of your git repo to determine the Docker image tag(s). This is designed to enable developers to more easily use [GitOps](https://www.weave.works/technologies/gitops/) in their CI/CD pipelines. Below is a table detailing how the GitHub trigger (branch or tag) determines the Docker tag(s).
| Trigger | Commit SHA | addLatest | addTimestamp | Docker Tag(s) |
|--------------------------|------------|-----------|--------------|----------------------------------------|
| /refs/tags/v1.0 | N/A | false | N/A | v1.0 |
| /refs/tags/v1.0 | N/A | true | N/A | v1.0,latest |
| /refs/heads/dev | 1234567 | false | true | dev-1234567-2021-09-01.195027 |
| /refs/heads/dev | 1234567 | true | false | dev-1234567,latest |
| /refs/heads/main | 1234567 | false | true | main-1234567-2021-09-01.195027 |
| /refs/heads/main | 1234567 | true | false | main-1234567,latest |
| /refs/heads/SOME-feature | 1234567 | false | true | some-feature-1234567-2021-09-01.195027 |
| /refs/heads/SOME-feature | 1234567 | true | false | some-feature-1234567,latest |
### Adding custom tags to GitOps tags
The `appendMode` input allows you to add additional tags while keeping the auto-generated GitOps tags:
```yaml
uses: mr-smithers-excellent/docker-build-push@v6
with:
image: repo/image
registry: docker.io
tags: stable,production
appendMode: true
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
```
For a `main` branch build with commit `1234567`, this would produce tags: `main-1234567,stable,production`
## BuildKit support
Enables [Docker BuildKit](https://docs.docker.com/build/buildkit/)
> **Note:** BuildKit is required when using advanced cache types such as `type=gha` or `type=registry` with the `cacheFrom` and `cacheTo` inputs. Set `enableBuildKit: true` to avoid errors like `unknown flag: --cache-to`.
```yaml
steps:
- uses: actions/checkout@v3
name: Check out code
- uses: mr-smithers-excellent/docker-build-push@v6
name: Build & push Docker image
with:
image: repo/image
registry: docker.io
enableBuildKit: true
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
```
## Multi-platform builds
Enables [multi-platform builds](https://docs.docker.com/build/building/multi-platform/) with the default [docker-container driver](https://docs.docker.com/build/drivers/docker-container/)
```yaml
steps:
- uses: actions/checkout@v3
name: Check out code
- uses: mr-smithers-excellent/docker-build-push@v6
name: Build & push Docker image
with:
image: repo/image
registry: docker.io
multiPlatform: true
platform: linux/amd64,linux/arm64,linux/arm/v7
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
```
Enables [multi-platform builds](https://docs.docker.com/build/building/multi-platform/) with custom driver
```yaml
steps:
- uses: actions/checkout@v3
name: Check out code
# Required when overrideDriver is set to true
- uses: docker/setup-buildx-action@v2
name: Customize Docker driver
with:
driver-opts: image=moby/buildkit:v0.11.0
- uses: mr-smithers-excellent/docker-build-push@v6
name: Build & push Docker image
with:
image: repo/image
registry: docker.io
multiPlatform: true
platform: linux/amd64,linux/arm64,linux/arm/v7
overrideDriver: true
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
```
================================================
FILE: action.yml
================================================
name: "Docker Build & Push Action"
description: "Builds a Docker image and pushes to a private registry with support for multiple tags"
author: "Sean Smith"
inputs:
image:
description: "Name of the Docker image"
required: true
tags:
description: "Tags override for Docker image"
required: false
appendMode:
description: "Append tags to auto-generated tags instead of replacing them"
required: false
default: "false"
registry:
description: "Target Docker registry"
required: true
dockerfile:
description: "Location of Dockerfile, if not Dockerfile in root directory"
required: false
default: "Dockerfile"
directory:
description: "Directory to run `docker build` from, if not project root"
required: false
buildArgs:
description: "Docker build arguments passed via --build-arg"
required: false
labels:
description: "Docker build labels passed via --label"
required: false
target:
description: "Docker build target passed via --target"
required: false
platform:
description: "Docker build platform passed via --platform"
required: false
ssh:
description: "Docker build ssh options passed via --ssh"
required: false
secrets:
description: "Docker build secrets passed via --secret (e.g. id=mysecret,src=secret.txt). Requires BuildKit."
required: false
username:
description: "Docker registry username"
required: false
password:
description: "Docker registry password"
required: false
gitHubOrg:
description: "GitHub organization to push image to (if not current)"
required: false
addLatest:
description: "Adds latest tag to auto-generated GitOps tag"
required: false
default: "false"
addTimestamp:
description: "Suffixes a build timestamp to the branch-based Docker tag"
required: false
default: "false"
enableBuildKit:
description: "Enables Docker BuildKit support"
required: false
default: "false"
cacheFrom:
description: "Docker cache source passed via --cache-from (e.g. type=gha or type=registry,ref=myimage:cache)"
required: false
cacheTo:
description: "Docker cache destination passed via --cache-to (e.g. type=gha,mode=max)"
required: false
multiPlatform:
description: "Builds image with buildx to support multiple platforms"
required: false
default: "false"
overrideDriver:
description: "Disables setting up docker-container driver"
required: false
default: "false"
skipLogin:
description: "Skip the Docker login step, useful when credentials are pre-configured via a credential helper or OIDC"
required: false
default: "false"
pushImage:
description: "Flag for disabling the login & push steps, set to true by default"
required: false
default: "true"
outputs:
imageFullName:
description: "Full name of the Docker image with registry prefix and tag suffix"
imageName:
description: "Name of the Docker image with owner prefix"
tags:
description: "Tags for the Docker image"
runs:
using: "node20"
main: "dist/index.js"
branding:
icon: "anchor"
color: "blue"
================================================
FILE: dist/index.js
================================================
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
// node_modules/tunnel/lib/tunnel.js
var require_tunnel = __commonJS({
"node_modules/tunnel/lib/tunnel.js"(exports2) {
"use strict";
var net = require("net");
var tls = require("tls");
var http = require("http");
var https = require("https");
var events = require("events");
var assert = require("assert");
var util = require("util");
exports2.httpOverHttp = httpOverHttp2;
exports2.httpsOverHttp = httpsOverHttp2;
exports2.httpOverHttps = httpOverHttps2;
exports2.httpsOverHttps = httpsOverHttps2;
function httpOverHttp2(options) {
var agent = new TunnelingAgent(options);
agent.request = http.request;
return agent;
}
function httpsOverHttp2(options) {
var agent = new TunnelingAgent(options);
agent.request = http.request;
agent.createSocket = createSecureSocket;
agent.defaultPort = 443;
return agent;
}
function httpOverHttps2(options) {
var agent = new TunnelingAgent(options);
agent.request = https.request;
return agent;
}
function httpsOverHttps2(options) {
var agent = new TunnelingAgent(options);
agent.request = https.request;
agent.createSocket = createSecureSocket;
agent.defaultPort = 443;
return agent;
}
function TunnelingAgent(options) {
var self2 = this;
self2.options = options || {};
self2.proxyOptions = self2.options.proxy || {};
self2.maxSockets = self2.options.maxSockets || http.Agent.defaultMaxSockets;
self2.requests = [];
self2.sockets = [];
self2.on("free", function onFree(socket, host, port, localAddress) {
var options2 = toOptions(host, port, localAddress);
for (var i = 0, len = self2.requests.length; i < len; ++i) {
var pending = self2.requests[i];
if (pending.host === options2.host && pending.port === options2.port) {
self2.requests.splice(i, 1);
pending.request.onSocket(socket);
return;
}
}
socket.destroy();
self2.removeSocket(socket);
});
}
util.inherits(TunnelingAgent, events.EventEmitter);
TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {
var self2 = this;
var options = mergeOptions({ request: req }, self2.options, toOptions(host, port, localAddress));
if (self2.sockets.length >= this.maxSockets) {
self2.requests.push(options);
return;
}
self2.createSocket(options, function(socket) {
socket.on("free", onFree);
socket.on("close", onCloseOrRemove);
socket.on("agentRemove", onCloseOrRemove);
req.onSocket(socket);
function onFree() {
self2.emit("free", socket, options);
}
function onCloseOrRemove(err) {
self2.removeSocket(socket);
socket.removeListener("free", onFree);
socket.removeListener("close", onCloseOrRemove);
socket.removeListener("agentRemove", onCloseOrRemove);
}
});
};
TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
var self2 = this;
var placeholder = {};
self2.sockets.push(placeholder);
var connectOptions = mergeOptions({}, self2.proxyOptions, {
method: "CONNECT",
path: options.host + ":" + options.port,
agent: false,
headers: {
host: options.host + ":" + options.port
}
});
if (options.localAddress) {
connectOptions.localAddress = options.localAddress;
}
if (connectOptions.proxyAuth) {
connectOptions.headers = connectOptions.headers || {};
connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64");
}
debug2("making CONNECT request");
var connectReq = self2.request(connectOptions);
connectReq.useChunkedEncodingByDefault = false;
connectReq.once("response", onResponse);
connectReq.once("upgrade", onUpgrade);
connectReq.once("connect", onConnect);
connectReq.once("error", onError);
connectReq.end();
function onResponse(res) {
res.upgrade = true;
}
function onUpgrade(res, socket, head) {
process.nextTick(function() {
onConnect(res, socket, head);
});
}
function onConnect(res, socket, head) {
connectReq.removeAllListeners();
socket.removeAllListeners();
if (res.statusCode !== 200) {
debug2(
"tunneling socket could not be established, statusCode=%d",
res.statusCode
);
socket.destroy();
var error2 = new Error("tunneling socket could not be established, statusCode=" + res.statusCode);
error2.code = "ECONNRESET";
options.request.emit("error", error2);
self2.removeSocket(placeholder);
return;
}
if (head.length > 0) {
debug2("got illegal response body from proxy");
socket.destroy();
var error2 = new Error("got illegal response body from proxy");
error2.code = "ECONNRESET";
options.request.emit("error", error2);
self2.removeSocket(placeholder);
return;
}
debug2("tunneling connection has established");
self2.sockets[self2.sockets.indexOf(placeholder)] = socket;
return cb(socket);
}
function onError(cause) {
connectReq.removeAllListeners();
debug2(
"tunneling socket could not be established, cause=%s\n",
cause.message,
cause.stack
);
var error2 = new Error("tunneling socket could not be established, cause=" + cause.message);
error2.code = "ECONNRESET";
options.request.emit("error", error2);
self2.removeSocket(placeholder);
}
};
TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
var pos = this.sockets.indexOf(socket);
if (pos === -1) {
return;
}
this.sockets.splice(pos, 1);
var pending = this.requests.shift();
if (pending) {
this.createSocket(pending, function(socket2) {
pending.request.onSocket(socket2);
});
}
};
function createSecureSocket(options, cb) {
var self2 = this;
TunnelingAgent.prototype.createSocket.call(self2, options, function(socket) {
var hostHeader = options.request.getHeader("host");
var tlsOptions = mergeOptions({}, self2.options, {
socket,
servername: hostHeader ? hostHeader.replace(/:.*$/, "") : options.host
});
var secureSocket = tls.connect(0, tlsOptions);
self2.sockets[self2.sockets.indexOf(socket)] = secureSocket;
cb(secureSocket);
});
}
function toOptions(host, port, localAddress) {
if (typeof host === "string") {
return {
host,
port,
localAddress
};
}
return host;
}
function mergeOptions(target) {
for (var i = 1, len = arguments.length; i < len; ++i) {
var overrides = arguments[i];
if (typeof overrides === "object") {
var keys = Object.keys(overrides);
for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
var k = keys[j];
if (overrides[k] !== void 0) {
target[k] = overrides[k];
}
}
}
}
return target;
}
var debug2;
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
debug2 = function() {
var args = Array.prototype.slice.call(arguments);
if (typeof args[0] === "string") {
args[0] = "TUNNEL: " + args[0];
} else {
args.unshift("TUNNEL:");
}
console.error.apply(console, args);
};
} else {
debug2 = function() {
};
}
exports2.debug = debug2;
}
});
// node_modules/tunnel/index.js
var require_tunnel2 = __commonJS({
"node_modules/tunnel/index.js"(exports2, module2) {
module2.exports = require_tunnel();
}
});
// node_modules/undici/lib/core/symbols.js
var require_symbols = __commonJS({
"node_modules/undici/lib/core/symbols.js"(exports2, module2) {
module2.exports = {
kClose: /* @__PURE__ */ Symbol("close"),
kDestroy: /* @__PURE__ */ Symbol("destroy"),
kDispatch: /* @__PURE__ */ Symbol("dispatch"),
kUrl: /* @__PURE__ */ Symbol("url"),
kWriting: /* @__PURE__ */ Symbol("writing"),
kResuming: /* @__PURE__ */ Symbol("resuming"),
kQueue: /* @__PURE__ */ Symbol("queue"),
kConnect: /* @__PURE__ */ Symbol("connect"),
kConnecting: /* @__PURE__ */ Symbol("connecting"),
kKeepAliveDefaultTimeout: /* @__PURE__ */ Symbol("default keep alive timeout"),
kKeepAliveMaxTimeout: /* @__PURE__ */ Symbol("max keep alive timeout"),
kKeepAliveTimeoutThreshold: /* @__PURE__ */ Symbol("keep alive timeout threshold"),
kKeepAliveTimeoutValue: /* @__PURE__ */ Symbol("keep alive timeout"),
kKeepAlive: /* @__PURE__ */ Symbol("keep alive"),
kHeadersTimeout: /* @__PURE__ */ Symbol("headers timeout"),
kBodyTimeout: /* @__PURE__ */ Symbol("body timeout"),
kServerName: /* @__PURE__ */ Symbol("server name"),
kLocalAddress: /* @__PURE__ */ Symbol("local address"),
kHost: /* @__PURE__ */ Symbol("host"),
kNoRef: /* @__PURE__ */ Symbol("no ref"),
kBodyUsed: /* @__PURE__ */ Symbol("used"),
kBody: /* @__PURE__ */ Symbol("abstracted request body"),
kRunning: /* @__PURE__ */ Symbol("running"),
kBlocking: /* @__PURE__ */ Symbol("blocking"),
kPending: /* @__PURE__ */ Symbol("pending"),
kSize: /* @__PURE__ */ Symbol("size"),
kBusy: /* @__PURE__ */ Symbol("busy"),
kQueued: /* @__PURE__ */ Symbol("queued"),
kFree: /* @__PURE__ */ Symbol("free"),
kConnected: /* @__PURE__ */ Symbol("connected"),
kClosed: /* @__PURE__ */ Symbol("closed"),
kNeedDrain: /* @__PURE__ */ Symbol("need drain"),
kReset: /* @__PURE__ */ Symbol("reset"),
kDestroyed: /* @__PURE__ */ Symbol.for("nodejs.stream.destroyed"),
kResume: /* @__PURE__ */ Symbol("resume"),
kOnError: /* @__PURE__ */ Symbol("on error"),
kMaxHeadersSize: /* @__PURE__ */ Symbol("max headers size"),
kRunningIdx: /* @__PURE__ */ Symbol("running index"),
kPendingIdx: /* @__PURE__ */ Symbol("pending index"),
kError: /* @__PURE__ */ Symbol("error"),
kClients: /* @__PURE__ */ Symbol("clients"),
kClient: /* @__PURE__ */ Symbol("client"),
kParser: /* @__PURE__ */ Symbol("parser"),
kOnDestroyed: /* @__PURE__ */ Symbol("destroy callbacks"),
kPipelining: /* @__PURE__ */ Symbol("pipelining"),
kSocket: /* @__PURE__ */ Symbol("socket"),
kHostHeader: /* @__PURE__ */ Symbol("host header"),
kConnector: /* @__PURE__ */ Symbol("connector"),
kStrictContentLength: /* @__PURE__ */ Symbol("strict content length"),
kMaxRedirections: /* @__PURE__ */ Symbol("maxRedirections"),
kMaxRequests: /* @__PURE__ */ Symbol("maxRequestsPerClient"),
kProxy: /* @__PURE__ */ Symbol("proxy agent options"),
kCounter: /* @__PURE__ */ Symbol("socket request counter"),
kInterceptors: /* @__PURE__ */ Symbol("dispatch interceptors"),
kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"),
kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"),
kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"),
kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"),
kConstruct: /* @__PURE__ */ Symbol("constructable"),
kListeners: /* @__PURE__ */ Symbol("listeners"),
kHTTPContext: /* @__PURE__ */ Symbol("http context"),
kMaxConcurrentStreams: /* @__PURE__ */ Symbol("max concurrent streams"),
kNoProxyAgent: /* @__PURE__ */ Symbol("no proxy agent"),
kHttpProxyAgent: /* @__PURE__ */ Symbol("http proxy agent"),
kHttpsProxyAgent: /* @__PURE__ */ Symbol("https proxy agent")
};
}
});
// node_modules/undici/lib/core/errors.js
var require_errors = __commonJS({
"node_modules/undici/lib/core/errors.js"(exports2, module2) {
"use strict";
var kUndiciError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR");
var UndiciError = class extends Error {
constructor(message) {
super(message);
this.name = "UndiciError";
this.code = "UND_ERR";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kUndiciError] === true;
}
[kUndiciError] = true;
};
var kConnectTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT");
var ConnectTimeoutError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "ConnectTimeoutError";
this.message = message || "Connect Timeout Error";
this.code = "UND_ERR_CONNECT_TIMEOUT";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kConnectTimeoutError] === true;
}
[kConnectTimeoutError] = true;
};
var kHeadersTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT");
var HeadersTimeoutError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "HeadersTimeoutError";
this.message = message || "Headers Timeout Error";
this.code = "UND_ERR_HEADERS_TIMEOUT";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kHeadersTimeoutError] === true;
}
[kHeadersTimeoutError] = true;
};
var kHeadersOverflowError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW");
var HeadersOverflowError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "HeadersOverflowError";
this.message = message || "Headers Overflow Error";
this.code = "UND_ERR_HEADERS_OVERFLOW";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kHeadersOverflowError] === true;
}
[kHeadersOverflowError] = true;
};
var kBodyTimeoutError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT");
var BodyTimeoutError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "BodyTimeoutError";
this.message = message || "Body Timeout Error";
this.code = "UND_ERR_BODY_TIMEOUT";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kBodyTimeoutError] === true;
}
[kBodyTimeoutError] = true;
};
var kResponseStatusCodeError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE");
var ResponseStatusCodeError = class extends UndiciError {
constructor(message, statusCode, headers, body) {
super(message);
this.name = "ResponseStatusCodeError";
this.message = message || "Response Status Code Error";
this.code = "UND_ERR_RESPONSE_STATUS_CODE";
this.body = body;
this.status = statusCode;
this.statusCode = statusCode;
this.headers = headers;
}
static [Symbol.hasInstance](instance) {
return instance && instance[kResponseStatusCodeError] === true;
}
[kResponseStatusCodeError] = true;
};
var kInvalidArgumentError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_ARG");
var InvalidArgumentError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "InvalidArgumentError";
this.message = message || "Invalid Argument Error";
this.code = "UND_ERR_INVALID_ARG";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kInvalidArgumentError] === true;
}
[kInvalidArgumentError] = true;
};
var kInvalidReturnValueError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE");
var InvalidReturnValueError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "InvalidReturnValueError";
this.message = message || "Invalid Return Value Error";
this.code = "UND_ERR_INVALID_RETURN_VALUE";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kInvalidReturnValueError] === true;
}
[kInvalidReturnValueError] = true;
};
var kAbortError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORT");
var AbortError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "AbortError";
this.message = message || "The operation was aborted";
this.code = "UND_ERR_ABORT";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kAbortError] === true;
}
[kAbortError] = true;
};
var kRequestAbortedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_ABORTED");
var RequestAbortedError = class extends AbortError {
constructor(message) {
super(message);
this.name = "AbortError";
this.message = message || "Request aborted";
this.code = "UND_ERR_ABORTED";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kRequestAbortedError] === true;
}
[kRequestAbortedError] = true;
};
var kInformationalError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_INFO");
var InformationalError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "InformationalError";
this.message = message || "Request information";
this.code = "UND_ERR_INFO";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kInformationalError] === true;
}
[kInformationalError] = true;
};
var kRequestContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH");
var RequestContentLengthMismatchError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "RequestContentLengthMismatchError";
this.message = message || "Request body length does not match content-length header";
this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kRequestContentLengthMismatchError] === true;
}
[kRequestContentLengthMismatchError] = true;
};
var kResponseContentLengthMismatchError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH");
var ResponseContentLengthMismatchError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "ResponseContentLengthMismatchError";
this.message = message || "Response body length does not match content-length header";
this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kResponseContentLengthMismatchError] === true;
}
[kResponseContentLengthMismatchError] = true;
};
var kClientDestroyedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_DESTROYED");
var ClientDestroyedError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "ClientDestroyedError";
this.message = message || "The client is destroyed";
this.code = "UND_ERR_DESTROYED";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kClientDestroyedError] === true;
}
[kClientDestroyedError] = true;
};
var kClientClosedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_CLOSED");
var ClientClosedError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "ClientClosedError";
this.message = message || "The client is closed";
this.code = "UND_ERR_CLOSED";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kClientClosedError] === true;
}
[kClientClosedError] = true;
};
var kSocketError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_SOCKET");
var SocketError = class extends UndiciError {
constructor(message, socket) {
super(message);
this.name = "SocketError";
this.message = message || "Socket error";
this.code = "UND_ERR_SOCKET";
this.socket = socket;
}
static [Symbol.hasInstance](instance) {
return instance && instance[kSocketError] === true;
}
[kSocketError] = true;
};
var kNotSupportedError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED");
var NotSupportedError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "NotSupportedError";
this.message = message || "Not supported error";
this.code = "UND_ERR_NOT_SUPPORTED";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kNotSupportedError] === true;
}
[kNotSupportedError] = true;
};
var kBalancedPoolMissingUpstreamError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM");
var BalancedPoolMissingUpstreamError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "MissingUpstreamError";
this.message = message || "No upstream has been added to the BalancedPool";
this.code = "UND_ERR_BPL_MISSING_UPSTREAM";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kBalancedPoolMissingUpstreamError] === true;
}
[kBalancedPoolMissingUpstreamError] = true;
};
var kHTTPParserError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_HTTP_PARSER");
var HTTPParserError = class extends Error {
constructor(message, code, data) {
super(message);
this.name = "HTTPParserError";
this.code = code ? `HPE_${code}` : void 0;
this.data = data ? data.toString() : void 0;
}
static [Symbol.hasInstance](instance) {
return instance && instance[kHTTPParserError] === true;
}
[kHTTPParserError] = true;
};
var kResponseExceededMaxSizeError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE");
var ResponseExceededMaxSizeError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "ResponseExceededMaxSizeError";
this.message = message || "Response content exceeded max size";
this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kResponseExceededMaxSizeError] === true;
}
[kResponseExceededMaxSizeError] = true;
};
var kRequestRetryError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_REQ_RETRY");
var RequestRetryError = class extends UndiciError {
constructor(message, code, { headers, data }) {
super(message);
this.name = "RequestRetryError";
this.message = message || "Request retry error";
this.code = "UND_ERR_REQ_RETRY";
this.statusCode = code;
this.data = data;
this.headers = headers;
}
static [Symbol.hasInstance](instance) {
return instance && instance[kRequestRetryError] === true;
}
[kRequestRetryError] = true;
};
var kResponseError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_RESPONSE");
var ResponseError = class extends UndiciError {
constructor(message, code, { headers, data }) {
super(message);
this.name = "ResponseError";
this.message = message || "Response error";
this.code = "UND_ERR_RESPONSE";
this.statusCode = code;
this.data = data;
this.headers = headers;
}
static [Symbol.hasInstance](instance) {
return instance && instance[kResponseError] === true;
}
[kResponseError] = true;
};
var kSecureProxyConnectionError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_PRX_TLS");
var SecureProxyConnectionError = class extends UndiciError {
constructor(cause, message, options) {
super(message, { cause, ...options ?? {} });
this.name = "SecureProxyConnectionError";
this.message = message || "Secure Proxy Connection failed";
this.code = "UND_ERR_PRX_TLS";
this.cause = cause;
}
static [Symbol.hasInstance](instance) {
return instance && instance[kSecureProxyConnectionError] === true;
}
[kSecureProxyConnectionError] = true;
};
var kMessageSizeExceededError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED");
var MessageSizeExceededError = class extends UndiciError {
constructor(message) {
super(message);
this.name = "MessageSizeExceededError";
this.message = message || "Max decompressed message size exceeded";
this.code = "UND_ERR_WS_MESSAGE_SIZE_EXCEEDED";
}
static [Symbol.hasInstance](instance) {
return instance && instance[kMessageSizeExceededError] === true;
}
get [kMessageSizeExceededError]() {
return true;
}
};
module2.exports = {
AbortError,
HTTPParserError,
UndiciError,
HeadersTimeoutError,
HeadersOverflowError,
BodyTimeoutError,
RequestContentLengthMismatchError,
ConnectTimeoutError,
ResponseStatusCodeError,
InvalidArgumentError,
InvalidReturnValueError,
RequestAbortedError,
ClientDestroyedError,
ClientClosedError,
InformationalError,
SocketError,
NotSupportedError,
ResponseContentLengthMismatchError,
BalancedPoolMissingUpstreamError,
ResponseExceededMaxSizeError,
RequestRetryError,
ResponseError,
SecureProxyConnectionError,
MessageSizeExceededError
};
}
});
// node_modules/undici/lib/core/constants.js
var require_constants = __commonJS({
"node_modules/undici/lib/core/constants.js"(exports2, module2) {
"use strict";
var headerNameLowerCasedRecord = {};
var wellknownHeaderNames = [
"Accept",
"Accept-Encoding",
"Accept-Language",
"Accept-Ranges",
"Access-Control-Allow-Credentials",
"Access-Control-Allow-Headers",
"Access-Control-Allow-Methods",
"Access-Control-Allow-Origin",
"Access-Control-Expose-Headers",
"Access-Control-Max-Age",
"Access-Control-Request-Headers",
"Access-Control-Request-Method",
"Age",
"Allow",
"Alt-Svc",
"Alt-Used",
"Authorization",
"Cache-Control",
"Clear-Site-Data",
"Connection",
"Content-Disposition",
"Content-Encoding",
"Content-Language",
"Content-Length",
"Content-Location",
"Content-Range",
"Content-Security-Policy",
"Content-Security-Policy-Report-Only",
"Content-Type",
"Cookie",
"Cross-Origin-Embedder-Policy",
"Cross-Origin-Opener-Policy",
"Cross-Origin-Resource-Policy",
"Date",
"Device-Memory",
"Downlink",
"ECT",
"ETag",
"Expect",
"Expect-CT",
"Expires",
"Forwarded",
"From",
"Host",
"If-Match",
"If-Modified-Since",
"If-None-Match",
"If-Range",
"If-Unmodified-Since",
"Keep-Alive",
"Last-Modified",
"Link",
"Location",
"Max-Forwards",
"Origin",
"Permissions-Policy",
"Pragma",
"Proxy-Authenticate",
"Proxy-Authorization",
"RTT",
"Range",
"Referer",
"Referrer-Policy",
"Refresh",
"Retry-After",
"Sec-WebSocket-Accept",
"Sec-WebSocket-Extensions",
"Sec-WebSocket-Key",
"Sec-WebSocket-Protocol",
"Sec-WebSocket-Version",
"Server",
"Server-Timing",
"Service-Worker-Allowed",
"Service-Worker-Navigation-Preload",
"Set-Cookie",
"SourceMap",
"Strict-Transport-Security",
"Supports-Loading-Mode",
"TE",
"Timing-Allow-Origin",
"Trailer",
"Transfer-Encoding",
"Upgrade",
"Upgrade-Insecure-Requests",
"User-Agent",
"Vary",
"Via",
"WWW-Authenticate",
"X-Content-Type-Options",
"X-DNS-Prefetch-Control",
"X-Frame-Options",
"X-Permitted-Cross-Domain-Policies",
"X-Powered-By",
"X-Requested-With",
"X-XSS-Protection"
];
for (let i = 0; i < wellknownHeaderNames.length; ++i) {
const key = wellknownHeaderNames[i];
const lowerCasedKey = key.toLowerCase();
headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey;
}
Object.setPrototypeOf(headerNameLowerCasedRecord, null);
module2.exports = {
wellknownHeaderNames,
headerNameLowerCasedRecord
};
}
});
// node_modules/undici/lib/core/tree.js
var require_tree = __commonJS({
"node_modules/undici/lib/core/tree.js"(exports2, module2) {
"use strict";
var {
wellknownHeaderNames,
headerNameLowerCasedRecord
} = require_constants();
var TstNode = class _TstNode {
/** @type {any} */
value = null;
/** @type {null | TstNode} */
left = null;
/** @type {null | TstNode} */
middle = null;
/** @type {null | TstNode} */
right = null;
/** @type {number} */
code;
/**
* @param {string} key
* @param {any} value
* @param {number} index
*/
constructor(key, value, index) {
if (index === void 0 || index >= key.length) {
throw new TypeError("Unreachable");
}
const code = this.code = key.charCodeAt(index);
if (code > 127) {
throw new TypeError("key must be ascii string");
}
if (key.length !== ++index) {
this.middle = new _TstNode(key, value, index);
} else {
this.value = value;
}
}
/**
* @param {string} key
* @param {any} value
*/
add(key, value) {
const length = key.length;
if (length === 0) {
throw new TypeError("Unreachable");
}
let index = 0;
let node = this;
while (true) {
const code = key.charCodeAt(index);
if (code > 127) {
throw new TypeError("key must be ascii string");
}
if (node.code === code) {
if (length === ++index) {
node.value = value;
break;
} else if (node.middle !== null) {
node = node.middle;
} else {
node.middle = new _TstNode(key, value, index);
break;
}
} else if (node.code < code) {
if (node.left !== null) {
node = node.left;
} else {
node.left = new _TstNode(key, value, index);
break;
}
} else if (node.right !== null) {
node = node.right;
} else {
node.right = new _TstNode(key, value, index);
break;
}
}
}
/**
* @param {Uint8Array} key
* @return {TstNode | null}
*/
search(key) {
const keylength = key.length;
let index = 0;
let node = this;
while (node !== null && index < keylength) {
let code = key[index];
if (code <= 90 && code >= 65) {
code |= 32;
}
while (node !== null) {
if (code === node.code) {
if (keylength === ++index) {
return node;
}
node = node.middle;
break;
}
node = node.code < code ? node.left : node.right;
}
}
return null;
}
};
var TernarySearchTree = class {
/** @type {TstNode | null} */
node = null;
/**
* @param {string} key
* @param {any} value
* */
insert(key, value) {
if (this.node === null) {
this.node = new TstNode(key, value, 0);
} else {
this.node.add(key, value);
}
}
/**
* @param {Uint8Array} key
* @return {any}
*/
lookup(key) {
return this.node?.search(key)?.value ?? null;
}
};
var tree = new TernarySearchTree();
for (let i = 0; i < wellknownHeaderNames.length; ++i) {
const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]];
tree.insert(key, key);
}
module2.exports = {
TernarySearchTree,
tree
};
}
});
// node_modules/undici/lib/core/util.js
var require_util = __commonJS({
"node_modules/undici/lib/core/util.js"(exports2, module2) {
"use strict";
var assert = require("node:assert");
var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols();
var { IncomingMessage } = require("node:http");
var stream = require("node:stream");
var net = require("node:net");
var { Blob: Blob2 } = require("node:buffer");
var nodeUtil = require("node:util");
var { stringify } = require("node:querystring");
var { EventEmitter: EE } = require("node:events");
var { InvalidArgumentError } = require_errors();
var { headerNameLowerCasedRecord } = require_constants();
var { tree } = require_tree();
var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v));
var BodyAsyncIterable = class {
constructor(body) {
this[kBody] = body;
this[kBodyUsed] = false;
}
async *[Symbol.asyncIterator]() {
assert(!this[kBodyUsed], "disturbed");
this[kBodyUsed] = true;
yield* this[kBody];
}
};
function wrapRequestBody(body) {
if (isStream(body)) {
if (bodyLength(body) === 0) {
body.on("data", function() {
assert(false);
});
}
if (typeof body.readableDidRead !== "boolean") {
body[kBodyUsed] = false;
EE.prototype.on.call(body, "data", function() {
this[kBodyUsed] = true;
});
}
return body;
} else if (body && typeof body.pipeTo === "function") {
return new BodyAsyncIterable(body);
} else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) {
return new BodyAsyncIterable(body);
} else {
return body;
}
}
function nop() {
}
function isStream(obj) {
return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function";
}
function isBlobLike(object) {
if (object === null) {
return false;
} else if (object instanceof Blob2) {
return true;
} else if (typeof object !== "object") {
return false;
} else {
const sTag = object[Symbol.toStringTag];
return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function");
}
}
function buildURL(url, queryParams) {
if (url.includes("?") || url.includes("#")) {
throw new Error('Query params cannot be passed when url already contains "?" or "#".');
}
const stringified = stringify(queryParams);
if (stringified) {
url += "?" + stringified;
}
return url;
}
function isValidPort(port) {
const value = parseInt(port, 10);
return value === Number(port) && value >= 0 && value <= 65535;
}
function isHttpOrHttpsPrefixed(value) {
return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":");
}
function parseURL(url) {
if (typeof url === "string") {
url = new URL(url);
if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {
throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`.");
}
return url;
}
if (!url || typeof url !== "object") {
throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object.");
}
if (!(url instanceof URL)) {
if (url.port != null && url.port !== "" && isValidPort(url.port) === false) {
throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer.");
}
if (url.path != null && typeof url.path !== "string") {
throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined.");
}
if (url.pathname != null && typeof url.pathname !== "string") {
throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined.");
}
if (url.hostname != null && typeof url.hostname !== "string") {
throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined.");
}
if (url.origin != null && typeof url.origin !== "string") {
throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined.");
}
if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {
throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`.");
}
const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80;
let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`;
let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`;
if (origin[origin.length - 1] === "/") {
origin = origin.slice(0, origin.length - 1);
}
if (path && path[0] !== "/") {
path = `/${path}`;
}
return new URL(`${origin}${path}`);
}
if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) {
throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`.");
}
return url;
}
function parseOrigin(url) {
url = parseURL(url);
if (url.pathname !== "/" || url.search || url.hash) {
throw new InvalidArgumentError("invalid url");
}
return url;
}
function getHostname(host) {
if (host[0] === "[") {
const idx2 = host.indexOf("]");
assert(idx2 !== -1);
return host.substring(1, idx2);
}
const idx = host.indexOf(":");
if (idx === -1) return host;
return host.substring(0, idx);
}
function getServerName(host) {
if (!host) {
return null;
}
assert(typeof host === "string");
const servername = getHostname(host);
if (net.isIP(servername)) {
return "";
}
return servername;
}
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
function isAsyncIterable(obj) {
return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function");
}
function isIterable(obj) {
return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function"));
}
function bodyLength(body) {
if (body == null) {
return 0;
} else if (isStream(body)) {
const state = body._readableState;
return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null;
} else if (isBlobLike(body)) {
return body.size != null ? body.size : null;
} else if (isBuffer(body)) {
return body.byteLength;
}
return null;
}
function isDestroyed(body) {
return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body));
}
function destroy(stream2, err) {
if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) {
return;
}
if (typeof stream2.destroy === "function") {
if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) {
stream2.socket = null;
}
stream2.destroy(err);
} else if (err) {
queueMicrotask(() => {
stream2.emit("error", err);
});
}
if (stream2.destroyed !== true) {
stream2[kDestroyed] = true;
}
}
var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/;
function parseKeepAliveTimeout(val) {
const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR);
return m ? parseInt(m[1], 10) * 1e3 : null;
}
function headerNameToString(value) {
return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase();
}
function bufferToLowerCasedHeaderName(value) {
return tree.lookup(value) ?? value.toString("latin1").toLowerCase();
}
function parseHeaders(headers, obj) {
if (obj === void 0) obj = {};
for (let i = 0; i < headers.length; i += 2) {
const key = headerNameToString(headers[i]);
let val = obj[key];
if (val) {
if (typeof val === "string") {
val = [val];
obj[key] = val;
}
val.push(headers[i + 1].toString("utf8"));
} else {
const headersValue = headers[i + 1];
if (typeof headersValue === "string") {
obj[key] = headersValue;
} else {
obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8");
}
}
}
if ("content-length" in obj && "content-disposition" in obj) {
obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1");
}
return obj;
}
function parseRawHeaders(headers) {
const len = headers.length;
const ret = new Array(len);
let hasContentLength = false;
let contentDispositionIdx = -1;
let key;
let val;
let kLen = 0;
for (let n = 0; n < headers.length; n += 2) {
key = headers[n];
val = headers[n + 1];
typeof key !== "string" && (key = key.toString());
typeof val !== "string" && (val = val.toString("utf8"));
kLen = key.length;
if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) {
hasContentLength = true;
} else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) {
contentDispositionIdx = n + 1;
}
ret[n] = key;
ret[n + 1] = val;
}
if (hasContentLength && contentDispositionIdx !== -1) {
ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1");
}
return ret;
}
function isBuffer(buffer) {
return buffer instanceof Uint8Array || Buffer.isBuffer(buffer);
}
function validateHandler(handler, method, upgrade) {
if (!handler || typeof handler !== "object") {
throw new InvalidArgumentError("handler must be an object");
}
if (typeof handler.onConnect !== "function") {
throw new InvalidArgumentError("invalid onConnect method");
}
if (typeof handler.onError !== "function") {
throw new InvalidArgumentError("invalid onError method");
}
if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) {
throw new InvalidArgumentError("invalid onBodySent method");
}
if (upgrade || method === "CONNECT") {
if (typeof handler.onUpgrade !== "function") {
throw new InvalidArgumentError("invalid onUpgrade method");
}
} else {
if (typeof handler.onHeaders !== "function") {
throw new InvalidArgumentError("invalid onHeaders method");
}
if (typeof handler.onData !== "function") {
throw new InvalidArgumentError("invalid onData method");
}
if (typeof handler.onComplete !== "function") {
throw new InvalidArgumentError("invalid onComplete method");
}
}
}
function isDisturbed(body) {
return !!(body && (stream.isDisturbed(body) || body[kBodyUsed]));
}
function isErrored(body) {
return !!(body && stream.isErrored(body));
}
function isReadable(body) {
return !!(body && stream.isReadable(body));
}
function getSocketInfo(socket) {
return {
localAddress: socket.localAddress,
localPort: socket.localPort,
remoteAddress: socket.remoteAddress,
remotePort: socket.remotePort,
remoteFamily: socket.remoteFamily,
timeout: socket.timeout,
bytesWritten: socket.bytesWritten,
bytesRead: socket.bytesRead
};
}
function ReadableStreamFrom(iterable) {
let iterator;
return new ReadableStream(
{
async start() {
iterator = iterable[Symbol.asyncIterator]();
},
async pull(controller) {
const { done, value } = await iterator.next();
if (done) {
queueMicrotask(() => {
controller.close();
controller.byobRequest?.respond(0);
});
} else {
const buf = Buffer.isBuffer(value) ? value : Buffer.from(value);
if (buf.byteLength) {
controller.enqueue(new Uint8Array(buf));
}
}
return controller.desiredSize > 0;
},
async cancel(reason) {
await iterator.return();
},
type: "bytes"
}
);
}
function isFormDataLike(object) {
return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData";
}
function addAbortListener(signal, listener) {
if ("addEventListener" in signal) {
signal.addEventListener("abort", listener, { once: true });
return () => signal.removeEventListener("abort", listener);
}
signal.addListener("abort", listener);
return () => signal.removeListener("abort", listener);
}
var hasToWellFormed = typeof String.prototype.toWellFormed === "function";
var hasIsWellFormed = typeof String.prototype.isWellFormed === "function";
function toUSVString(val) {
return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val);
}
function isUSVString(val) {
return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`;
}
function isTokenCharCode(c) {
switch (c) {
case 34:
case 40:
case 41:
case 44:
case 47:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 64:
case 91:
case 92:
case 93:
case 123:
case 125:
return false;
default:
return c >= 33 && c <= 126;
}
}
function isValidHTTPToken(characters) {
if (characters.length === 0) {
return false;
}
for (let i = 0; i < characters.length; ++i) {
if (!isTokenCharCode(characters.charCodeAt(i))) {
return false;
}
}
return true;
}
var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
function isValidHeaderValue(characters) {
return !headerCharRegex.test(characters);
}
function parseRangeHeader(range) {
if (range == null || range === "") return { start: 0, end: null, size: null };
const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null;
return m ? {
start: parseInt(m[1]),
end: m[2] ? parseInt(m[2]) : null,
size: m[3] ? parseInt(m[3]) : null
} : null;
}
function addListener(obj, name, listener) {
const listeners = obj[kListeners] ??= [];
listeners.push([name, listener]);
obj.on(name, listener);
return obj;
}
function removeAllListeners(obj) {
for (const [name, listener] of obj[kListeners] ?? []) {
obj.removeListener(name, listener);
}
obj[kListeners] = null;
}
function errorRequest(client, request, err) {
try {
request.onError(err);
assert(request.aborted);
} catch (err2) {
client.emit("error", err2);
}
}
var kEnumerableProperty = /* @__PURE__ */ Object.create(null);
kEnumerableProperty.enumerable = true;
var normalizedMethodRecordsBase = {
delete: "DELETE",
DELETE: "DELETE",
get: "GET",
GET: "GET",
head: "HEAD",
HEAD: "HEAD",
options: "OPTIONS",
OPTIONS: "OPTIONS",
post: "POST",
POST: "POST",
put: "PUT",
PUT: "PUT"
};
var normalizedMethodRecords = {
...normalizedMethodRecordsBase,
patch: "patch",
PATCH: "PATCH"
};
Object.setPrototypeOf(normalizedMethodRecordsBase, null);
Object.setPrototypeOf(normalizedMethodRecords, null);
module2.exports = {
kEnumerableProperty,
nop,
isDisturbed,
isErrored,
isReadable,
toUSVString,
isUSVString,
isBlobLike,
parseOrigin,
parseURL,
getServerName,
isStream,
isIterable,
isAsyncIterable,
isDestroyed,
headerNameToString,
bufferToLowerCasedHeaderName,
addListener,
removeAllListeners,
errorRequest,
parseRawHeaders,
parseHeaders,
parseKeepAliveTimeout,
destroy,
bodyLength,
deepClone,
ReadableStreamFrom,
isBuffer,
validateHandler,
getSocketInfo,
isFormDataLike,
buildURL,
addAbortListener,
isValidHTTPToken,
isValidHeaderValue,
isTokenCharCode,
parseRangeHeader,
normalizedMethodRecordsBase,
normalizedMethodRecords,
isValidPort,
isHttpOrHttpsPrefixed,
nodeMajor,
nodeMinor,
safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"],
wrapRequestBody
};
}
});
// node_modules/undici/lib/core/diagnostics.js
var require_diagnostics = __commonJS({
"node_modules/undici/lib/core/diagnostics.js"(exports2, module2) {
"use strict";
var diagnosticsChannel = require("node:diagnostics_channel");
var util = require("node:util");
var undiciDebugLog = util.debuglog("undici");
var fetchDebuglog = util.debuglog("fetch");
var websocketDebuglog = util.debuglog("websocket");
var isClientSet = false;
var channels = {
// Client
beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"),
connected: diagnosticsChannel.channel("undici:client:connected"),
connectError: diagnosticsChannel.channel("undici:client:connectError"),
sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"),
// Request
create: diagnosticsChannel.channel("undici:request:create"),
bodySent: diagnosticsChannel.channel("undici:request:bodySent"),
headers: diagnosticsChannel.channel("undici:request:headers"),
trailers: diagnosticsChannel.channel("undici:request:trailers"),
error: diagnosticsChannel.channel("undici:request:error"),
// WebSocket
open: diagnosticsChannel.channel("undici:websocket:open"),
close: diagnosticsChannel.channel("undici:websocket:close"),
socketError: diagnosticsChannel.channel("undici:websocket:socket_error"),
ping: diagnosticsChannel.channel("undici:websocket:ping"),
pong: diagnosticsChannel.channel("undici:websocket:pong")
};
if (undiciDebugLog.enabled || fetchDebuglog.enabled) {
const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog;
diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => {
const {
connectParams: { version, protocol, port, host }
} = evt;
debuglog(
"connecting to %s using %s%s",
`${host}${port ? `:${port}` : ""}`,
protocol,
version
);
});
diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => {
const {
connectParams: { version, protocol, port, host }
} = evt;
debuglog(
"connected to %s using %s%s",
`${host}${port ? `:${port}` : ""}`,
protocol,
version
);
});
diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => {
const {
connectParams: { version, protocol, port, host },
error: error2
} = evt;
debuglog(
"connection to %s using %s%s errored - %s",
`${host}${port ? `:${port}` : ""}`,
protocol,
version,
error2.message
);
});
diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => {
const {
request: { method, path, origin }
} = evt;
debuglog("sending request to %s %s/%s", method, origin, path);
});
diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => {
const {
request: { method, path, origin },
response: { statusCode }
} = evt;
debuglog(
"received response to %s %s/%s - HTTP %d",
method,
origin,
path,
statusCode
);
});
diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => {
const {
request: { method, path, origin }
} = evt;
debuglog("trailers received from %s %s/%s", method, origin, path);
});
diagnosticsChannel.channel("undici:request:error").subscribe((evt) => {
const {
request: { method, path, origin },
error: error2
} = evt;
debuglog(
"request to %s %s/%s errored - %s",
method,
origin,
path,
error2.message
);
});
isClientSet = true;
}
if (websocketDebuglog.enabled) {
if (!isClientSet) {
const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog;
diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => {
const {
connectParams: { version, protocol, port, host }
} = evt;
debuglog(
"connecting to %s%s using %s%s",
host,
port ? `:${port}` : "",
protocol,
version
);
});
diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => {
const {
connectParams: { version, protocol, port, host }
} = evt;
debuglog(
"connected to %s%s using %s%s",
host,
port ? `:${port}` : "",
protocol,
version
);
});
diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => {
const {
connectParams: { version, protocol, port, host },
error: error2
} = evt;
debuglog(
"connection to %s%s using %s%s errored - %s",
host,
port ? `:${port}` : "",
protocol,
version,
error2.message
);
});
diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => {
const {
request: { method, path, origin }
} = evt;
debuglog("sending request to %s %s/%s", method, origin, path);
});
}
diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => {
const {
address: { address, port }
} = evt;
websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : "");
});
diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => {
const { websocket, code, reason } = evt;
websocketDebuglog(
"closed connection to %s - %s %s",
websocket.url,
code,
reason
);
});
diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => {
websocketDebuglog("connection errored - %s", err.message);
});
diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => {
websocketDebuglog("ping received");
});
diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => {
websocketDebuglog("pong received");
});
}
module2.exports = {
channels
};
}
});
// node_modules/undici/lib/core/request.js
var require_request = __commonJS({
"node_modules/undici/lib/core/request.js"(exports2, module2) {
"use strict";
var {
InvalidArgumentError,
NotSupportedError
} = require_errors();
var assert = require("node:assert");
var {
isValidHTTPToken,
isValidHeaderValue,
isStream,
destroy,
isBuffer,
isFormDataLike,
isIterable,
isBlobLike,
buildURL,
validateHandler,
getServerName,
normalizedMethodRecords
} = require_util();
var { channels } = require_diagnostics();
var { headerNameLowerCasedRecord } = require_constants();
var invalidPathRegex = /[^\u0021-\u00ff]/;
var kHandler = /* @__PURE__ */ Symbol("handler");
var Request = class {
constructor(origin, {
path,
method,
body,
headers,
query,
idempotent,
blocking,
upgrade,
headersTimeout,
bodyTimeout,
reset,
throwOnError,
expectContinue,
servername
}, handler) {
if (typeof path !== "string") {
throw new InvalidArgumentError("path must be a string");
} else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") {
throw new InvalidArgumentError("path must be an absolute URL or start with a slash");
} else if (invalidPathRegex.test(path)) {
throw new InvalidArgumentError("invalid request path");
}
if (typeof method !== "string") {
throw new InvalidArgumentError("method must be a string");
} else if (normalizedMethodRecords[method] === void 0 && !isValidHTTPToken(method)) {
throw new InvalidArgumentError("invalid request method");
}
if (upgrade && typeof upgrade !== "string") {
throw new InvalidArgumentError("upgrade must be a string");
}
if (upgrade && !isValidHeaderValue(upgrade)) {
throw new InvalidArgumentError("invalid upgrade header");
}
if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
throw new InvalidArgumentError("invalid headersTimeout");
}
if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {
throw new InvalidArgumentError("invalid bodyTimeout");
}
if (reset != null && typeof reset !== "boolean") {
throw new InvalidArgumentError("invalid reset");
}
if (expectContinue != null && typeof expectContinue !== "boolean") {
throw new InvalidArgumentError("invalid expectContinue");
}
this.headersTimeout = headersTimeout;
this.bodyTimeout = bodyTimeout;
this.throwOnError = throwOnError === true;
this.method = method;
this.abort = null;
if (body == null) {
this.body = null;
} else if (isStream(body)) {
this.body = body;
const rState = this.body._readableState;
if (!rState || !rState.autoDestroy) {
this.endHandler = function autoDestroy() {
destroy(this);
};
this.body.on("end", this.endHandler);
}
this.errorHandler = (err) => {
if (this.abort) {
this.abort(err);
} else {
this.error = err;
}
};
this.body.on("error", this.errorHandler);
} else if (isBuffer(body)) {
this.body = body.byteLength ? body : null;
} else if (ArrayBuffer.isView(body)) {
this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null;
} else if (body instanceof ArrayBuffer) {
this.body = body.byteLength ? Buffer.from(body) : null;
} else if (typeof body === "string") {
this.body = body.length ? Buffer.from(body) : null;
} else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) {
this.body = body;
} else {
throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable");
}
this.completed = false;
this.aborted = false;
this.upgrade = upgrade || null;
this.path = query ? buildURL(path, query) : path;
this.origin = origin;
this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent;
this.blocking = blocking == null ? false : blocking;
this.reset = reset == null ? null : reset;
this.host = null;
this.contentLength = null;
this.contentType = null;
this.headers = [];
this.expectContinue = expectContinue != null ? expectContinue : false;
if (Array.isArray(headers)) {
if (headers.length % 2 !== 0) {
throw new InvalidArgumentError("headers array must be even");
}
for (let i = 0; i < headers.length; i += 2) {
processHeader(this, headers[i], headers[i + 1]);
}
} else if (headers && typeof headers === "object") {
if (headers[Symbol.iterator]) {
for (const header of headers) {
if (!Array.isArray(header) || header.length !== 2) {
throw new InvalidArgumentError("headers must be in key-value pair format");
}
processHeader(this, header[0], header[1]);
}
} else {
const keys = Object.keys(headers);
for (let i = 0; i < keys.length; ++i) {
processHeader(this, keys[i], headers[keys[i]]);
}
}
} else if (headers != null) {
throw new InvalidArgumentError("headers must be an object or an array");
}
validateHandler(handler, method, upgrade);
this.servername = servername || getServerName(this.host);
this[kHandler] = handler;
if (channels.create.hasSubscribers) {
channels.create.publish({ request: this });
}
}
onBodySent(chunk) {
if (this[kHandler].onBodySent) {
try {
return this[kHandler].onBodySent(chunk);
} catch (err) {
this.abort(err);
}
}
}
onRequestSent() {
if (channels.bodySent.hasSubscribers) {
channels.bodySent.publish({ request: this });
}
if (this[kHandler].onRequestSent) {
try {
return this[kHandler].onRequestSent();
} catch (err) {
this.abort(err);
}
}
}
onConnect(abort) {
assert(!this.aborted);
assert(!this.completed);
if (this.error) {
abort(this.error);
} else {
this.abort = abort;
return this[kHandler].onConnect(abort);
}
}
onResponseStarted() {
return this[kHandler].onResponseStarted?.();
}
onHeaders(statusCode, headers, resume, statusText) {
assert(!this.aborted);
assert(!this.completed);
if (channels.headers.hasSubscribers) {
channels.headers.publish({ request: this, response: { statusCode, headers, statusText } });
}
try {
return this[kHandler].onHeaders(statusCode, headers, resume, statusText);
} catch (err) {
this.abort(err);
}
}
onData(chunk) {
assert(!this.aborted);
assert(!this.completed);
try {
return this[kHandler].onData(chunk);
} catch (err) {
this.abort(err);
return false;
}
}
onUpgrade(statusCode, headers, socket) {
assert(!this.aborted);
assert(!this.completed);
return this[kHandler].onUpgrade(statusCode, headers, socket);
}
onComplete(trailers) {
this.onFinally();
assert(!this.aborted);
this.completed = true;
if (channels.trailers.hasSubscribers) {
channels.trailers.publish({ request: this, trailers });
}
try {
return this[kHandler].onComplete(trailers);
} catch (err) {
this.onError(err);
}
}
onError(error2) {
this.onFinally();
if (channels.error.hasSubscribers) {
channels.error.publish({ request: this, error: error2 });
}
if (this.aborted) {
return;
}
this.aborted = true;
return this[kHandler].onError(error2);
}
onFinally() {
if (this.errorHandler) {
this.body.off("error", this.errorHandler);
this.errorHandler = null;
}
if (this.endHandler) {
this.body.off("end", this.endHandler);
this.endHandler = null;
}
}
addHeader(key, value) {
processHeader(this, key, value);
return this;
}
};
function processHeader(request, key, val) {
if (val && (typeof val === "object" && !Array.isArray(val))) {
throw new InvalidArgumentError(`invalid ${key} header`);
} else if (val === void 0) {
return;
}
let headerName = headerNameLowerCasedRecord[key];
if (headerName === void 0) {
headerName = key.toLowerCase();
if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) {
throw new InvalidArgumentError("invalid header key");
}
}
if (Array.isArray(val)) {
const arr = [];
for (let i = 0; i < val.length; i++) {
if (typeof val[i] === "string") {
if (!isValidHeaderValue(val[i])) {
throw new InvalidArgumentError(`invalid ${key} header`);
}
arr.push(val[i]);
} else if (val[i] === null) {
arr.push("");
} else if (typeof val[i] === "object") {
throw new InvalidArgumentError(`invalid ${key} header`);
} else {
arr.push(`${val[i]}`);
}
}
val = arr;
} else if (typeof val === "string") {
if (!isValidHeaderValue(val)) {
throw new InvalidArgumentError(`invalid ${key} header`);
}
} else if (val === null) {
val = "";
} else {
val = `${val}`;
}
if (headerName === "host") {
if (request.host !== null) {
throw new InvalidArgumentError("duplicate host header");
}
if (typeof val !== "string") {
throw new InvalidArgumentError("invalid host header");
}
request.host = val;
} else if (headerName === "content-length") {
if (request.contentLength !== null) {
throw new InvalidArgumentError("duplicate content-length header");
}
request.contentLength = parseInt(val, 10);
if (!Number.isFinite(request.contentLength)) {
throw new InvalidArgumentError("invalid content-length header");
}
} else if (request.contentType === null && headerName === "content-type") {
request.contentType = val;
request.headers.push(key, val);
} else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") {
throw new InvalidArgumentError(`invalid ${headerName} header`);
} else if (headerName === "connection") {
const value = typeof val === "string" ? val.toLowerCase() : null;
if (value !== "close" && value !== "keep-alive") {
throw new InvalidArgumentError("invalid connection header");
}
if (value === "close") {
request.reset = true;
}
} else if (headerName === "expect") {
throw new NotSupportedError("expect header not supported");
} else {
request.headers.push(key, val);
}
}
module2.exports = Request;
}
});
// node_modules/undici/lib/dispatcher/dispatcher.js
var require_dispatcher = __commonJS({
"node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) {
"use strict";
var EventEmitter = require("node:events");
var Dispatcher = class extends EventEmitter {
dispatch() {
throw new Error("not implemented");
}
close() {
throw new Error("not implemented");
}
destroy() {
throw new Error("not implemented");
}
compose(...args) {
const interceptors = Array.isArray(args[0]) ? args[0] : args;
let dispatch = this.dispatch.bind(this);
for (const interceptor of interceptors) {
if (interceptor == null) {
continue;
}
if (typeof interceptor !== "function") {
throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`);
}
dispatch = interceptor(dispatch);
if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) {
throw new TypeError("invalid interceptor");
}
}
return new ComposedDispatcher(this, dispatch);
}
};
var ComposedDispatcher = class extends Dispatcher {
#dispatcher = null;
#dispatch = null;
constructor(dispatcher, dispatch) {
super();
this.#dispatcher = dispatcher;
this.#dispatch = dispatch;
}
dispatch(...args) {
this.#dispatch(...args);
}
close(...args) {
return this.#dispatcher.close(...args);
}
destroy(...args) {
return this.#dispatcher.destroy(...args);
}
};
module2.exports = Dispatcher;
}
});
// node_modules/undici/lib/dispatcher/dispatcher-base.js
var require_dispatcher_base = __commonJS({
"node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) {
"use strict";
var Dispatcher = require_dispatcher();
var {
ClientDestroyedError,
ClientClosedError,
InvalidArgumentError
} = require_errors();
var { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = require_symbols();
var kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed");
var kOnClosed = /* @__PURE__ */ Symbol("onClosed");
var kInterceptedDispatch = /* @__PURE__ */ Symbol("Intercepted Dispatch");
var DispatcherBase = class extends Dispatcher {
constructor() {
super();
this[kDestroyed] = false;
this[kOnDestroyed] = null;
this[kClosed] = false;
this[kOnClosed] = [];
}
get destroyed() {
return this[kDestroyed];
}
get closed() {
return this[kClosed];
}
get interceptors() {
return this[kInterceptors];
}
set interceptors(newInterceptors) {
if (newInterceptors) {
for (let i = newInterceptors.length - 1; i >= 0; i--) {
const interceptor = this[kInterceptors][i];
if (typeof interceptor !== "function") {
throw new InvalidArgumentError("interceptor must be an function");
}
}
}
this[kInterceptors] = newInterceptors;
}
close(callback) {
if (callback === void 0) {
return new Promise((resolve, reject) => {
this.close((err, data) => {
return err ? reject(err) : resolve(data);
});
});
}
if (typeof callback !== "function") {
throw new InvalidArgumentError("invalid callback");
}
if (this[kDestroyed]) {
queueMicrotask(() => callback(new ClientDestroyedError(), null));
return;
}
if (this[kClosed]) {
if (this[kOnClosed]) {
this[kOnClosed].push(callback);
} else {
queueMicrotask(() => callback(null, null));
}
return;
}
this[kClosed] = true;
this[kOnClosed].push(callback);
const onClosed = () => {
const callbacks = this[kOnClosed];
this[kOnClosed] = null;
for (let i = 0; i < callbacks.length; i++) {
callbacks[i](null, null);
}
};
this[kClose]().then(() => this.destroy()).then(() => {
queueMicrotask(onClosed);
});
}
destroy(err, callback) {
if (typeof err === "function") {
callback = err;
err = null;
}
if (callback === void 0) {
return new Promise((resolve, reject) => {
this.destroy(err, (err2, data) => {
return err2 ? (
/* istanbul ignore next: should never error */
reject(err2)
) : resolve(data);
});
});
}
if (typeof callback !== "function") {
throw new InvalidArgumentError("invalid callback");
}
if (this[kDestroyed]) {
if (this[kOnDestroyed]) {
this[kOnDestroyed].push(callback);
} else {
queueMicrotask(() => callback(null, null));
}
return;
}
if (!err) {
err = new ClientDestroyedError();
}
this[kDestroyed] = true;
this[kOnDestroyed] = this[kOnDestroyed] || [];
this[kOnDestroyed].push(callback);
const onDestroyed = () => {
const callbacks = this[kOnDestroyed];
this[kOnDestroyed] = null;
for (let i = 0; i < callbacks.length; i++) {
callbacks[i](null, null);
}
};
this[kDestroy](err).then(() => {
queueMicrotask(onDestroyed);
});
}
[kInterceptedDispatch](opts, handler) {
if (!this[kInterceptors] || this[kInterceptors].length === 0) {
this[kInterceptedDispatch] = this[kDispatch];
return this[kDispatch](opts, handler);
}
let dispatch = this[kDispatch].bind(this);
for (let i = this[kInterceptors].length - 1; i >= 0; i--) {
dispatch = this[kInterceptors][i](dispatch);
}
this[kInterceptedDispatch] = dispatch;
return dispatch(opts, handler);
}
dispatch(opts, handler) {
if (!handler || typeof handler !== "object") {
throw new InvalidArgumentError("handler must be an object");
}
try {
if (!opts || typeof opts !== "object") {
throw new InvalidArgumentError("opts must be an object.");
}
if (this[kDestroyed] || this[kOnDestroyed]) {
throw new ClientDestroyedError();
}
if (this[kClosed]) {
throw new ClientClosedError();
}
return this[kInterceptedDispatch](opts, handler);
} catch (err) {
if (typeof handler.onError !== "function") {
throw new InvalidArgumentError("invalid onError method");
}
handler.onError(err);
return false;
}
}
};
module2.exports = DispatcherBase;
}
});
// node_modules/undici/lib/util/timers.js
var require_timers = __commonJS({
"node_modules/undici/lib/util/timers.js"(exports2, module2) {
"use strict";
var fastNow = 0;
var RESOLUTION_MS = 1e3;
var TICK_MS = (RESOLUTION_MS >> 1) - 1;
var fastNowTimeout;
var kFastTimer = /* @__PURE__ */ Symbol("kFastTimer");
var fastTimers = [];
var NOT_IN_LIST = -2;
var TO_BE_CLEARED = -1;
var PENDING = 0;
var ACTIVE = 1;
function onTick() {
fastNow += TICK_MS;
let idx = 0;
let len = fastTimers.length;
while (idx < len) {
const timer = fastTimers[idx];
if (timer._state === PENDING) {
timer._idleStart = fastNow - TICK_MS;
timer._state = ACTIVE;
} else if (timer._state === ACTIVE && fastNow >= timer._idleStart + timer._idleTimeout) {
timer._state = TO_BE_CLEARED;
timer._idleStart = -1;
timer._onTimeout(timer._timerArg);
}
if (timer._state === TO_BE_CLEARED) {
timer._state = NOT_IN_LIST;
if (--len !== 0) {
fastTimers[idx] = fastTimers[len];
}
} else {
++idx;
}
}
fastTimers.length = len;
if (fastTimers.length !== 0) {
refreshTimeout();
}
}
function refreshTimeout() {
if (fastNowTimeout) {
fastNowTimeout.refresh();
} else {
clearTimeout(fastNowTimeout);
fastNowTimeout = setTimeout(onTick, TICK_MS);
if (fastNowTimeout.unref) {
fastNowTimeout.unref();
}
}
}
var FastTimer = class {
[kFastTimer] = true;
/**
* The state of the timer, which can be one of the following:
* - NOT_IN_LIST (-2)
* - TO_BE_CLEARED (-1)
* - PENDING (0)
* - ACTIVE (1)
*
* @type {-2|-1|0|1}
* @private
*/
_state = NOT_IN_LIST;
/**
* The number of milliseconds to wait before calling the callback.
*
* @type {number}
* @private
*/
_idleTimeout = -1;
/**
* The time in milliseconds when the timer was started. This value is used to
* calculate when the timer should expire.
*
* @type {number}
* @default -1
* @private
*/
_idleStart = -1;
/**
* The function to be executed when the timer expires.
* @type {Function}
* @private
*/
_onTimeout;
/**
* The argument to be passed to the callback when the timer expires.
*
* @type {*}
* @private
*/
_timerArg;
/**
* @constructor
* @param {Function} callback A function to be executed after the timer
* expires.
* @param {number} delay The time, in milliseconds that the timer should wait
* before the specified function or code is executed.
* @param {*} arg
*/
constructor(callback, delay, arg) {
this._onTimeout = callback;
this._idleTimeout = delay;
this._timerArg = arg;
this.refresh();
}
/**
* Sets the timer's start time to the current time, and reschedules the timer
* to call its callback at the previously specified duration adjusted to the
* current time.
* Using this on a timer that has already called its callback will reactivate
* the timer.
*
* @returns {void}
*/
refresh() {
if (this._state === NOT_IN_LIST) {
fastTimers.push(this);
}
if (!fastNowTimeout || fastTimers.length === 1) {
refreshTimeout();
}
this._state = PENDING;
}
/**
* The `clear` method cancels the timer, preventing it from executing.
*
* @returns {void}
* @private
*/
clear() {
this._state = TO_BE_CLEARED;
this._idleStart = -1;
}
};
module2.exports = {
/**
* The setTimeout() method sets a timer which executes a function once the
* timer expires.
* @param {Function} callback A function to be executed after the timer
* expires.
* @param {number} delay The time, in milliseconds that the timer should
* wait before the specified function or code is executed.
* @param {*} [arg] An optional argument to be passed to the callback function
* when the timer expires.
* @returns {NodeJS.Timeout|FastTimer}
*/
setTimeout(callback, delay, arg) {
return delay <= RESOLUTION_MS ? setTimeout(callback, delay, arg) : new FastTimer(callback, delay, arg);
},
/**
* The clearTimeout method cancels an instantiated Timer previously created
* by calling setTimeout.
*
* @param {NodeJS.Timeout|FastTimer} timeout
*/
clearTimeout(timeout) {
if (timeout[kFastTimer]) {
timeout.clear();
} else {
clearTimeout(timeout);
}
},
/**
* The setFastTimeout() method sets a fastTimer which executes a function once
* the timer expires.
* @param {Function} callback A function to be executed after the timer
* expires.
* @param {number} delay The time, in milliseconds that the timer should
* wait before the specified function or code is executed.
* @param {*} [arg] An optional argument to be passed to the callback function
* when the timer expires.
* @returns {FastTimer}
*/
setFastTimeout(callback, delay, arg) {
return new FastTimer(callback, delay, arg);
},
/**
* The clearTimeout method cancels an instantiated FastTimer previously
* created by calling setFastTimeout.
*
* @param {FastTimer} timeout
*/
clearFastTimeout(timeout) {
timeout.clear();
},
/**
* The now method returns the value of the internal fast timer clock.
*
* @returns {number}
*/
now() {
return fastNow;
},
/**
* Trigger the onTick function to process the fastTimers array.
* Exported for testing purposes only.
* Marking as deprecated to discourage any use outside of testing.
* @deprecated
* @param {number} [delay=0] The delay in milliseconds to add to the now value.
*/
tick(delay = 0) {
fastNow += delay - RESOLUTION_MS + 1;
onTick();
onTick();
},
/**
* Reset FastTimers.
* Exported for testing purposes only.
* Marking as deprecated to discourage any use outside of testing.
* @deprecated
*/
reset() {
fastNow = 0;
fastTimers.length = 0;
clearTimeout(fastNowTimeout);
fastNowTimeout = null;
},
/**
* Exporting for testing purposes only.
* Marking as deprecated to discourage any use outside of testing.
* @deprecated
*/
kFastTimer
};
}
});
// node_modules/undici/lib/core/connect.js
var require_connect = __commonJS({
"node_modules/undici/lib/core/connect.js"(exports2, module2) {
"use strict";
var net = require("node:net");
var assert = require("node:assert");
var util = require_util();
var { InvalidArgumentError, ConnectTimeoutError } = require_errors();
var timers = require_timers();
function noop() {
}
var tls;
var SessionCache;
if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) {
SessionCache = class WeakSessionCache {
constructor(maxCachedSessions) {
this._maxCachedSessions = maxCachedSessions;
this._sessionCache = /* @__PURE__ */ new Map();
this._sessionRegistry = new global.FinalizationRegistry((key) => {
if (this._sessionCache.size < this._maxCachedSessions) {
return;
}
const ref = this._sessionCache.get(key);
if (ref !== void 0 && ref.deref() === void 0) {
this._sessionCache.delete(key);
}
});
}
get(sessionKey) {
const ref = this._sessionCache.get(sessionKey);
return ref ? ref.deref() : null;
}
set(sessionKey, session) {
if (this._maxCachedSessions === 0) {
return;
}
this._sessionCache.set(sessionKey, new WeakRef(session));
this._sessionRegistry.register(session, sessionKey);
}
};
} else {
SessionCache = class SimpleSessionCache {
constructor(maxCachedSessions) {
this._maxCachedSessions = maxCachedSessions;
this._sessionCache = /* @__PURE__ */ new Map();
}
get(sessionKey) {
return this._sessionCache.get(sessionKey);
}
set(sessionKey, session) {
if (this._maxCachedSessions === 0) {
return;
}
if (this._sessionCache.size >= this._maxCachedSessions) {
const { value: oldestKey } = this._sessionCache.keys().next();
this._sessionCache.delete(oldestKey);
}
this._sessionCache.set(sessionKey, session);
}
};
}
function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {
if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {
throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero");
}
const options = { path: socketPath, ...opts };
const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions);
timeout = timeout == null ? 1e4 : timeout;
allowH2 = allowH2 != null ? allowH2 : false;
return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
let socket;
if (protocol === "https:") {
if (!tls) {
tls = require("node:tls");
}
servername = servername || options.servername || util.getServerName(host) || null;
const sessionKey = servername || hostname;
assert(sessionKey);
const session = customSession || sessionCache.get(sessionKey) || null;
port = port || 443;
socket = tls.connect({
highWaterMark: 16384,
// TLS in node can't have bigger HWM anyway...
...options,
servername,
session,
localAddress,
// TODO(HTTP/2): Add support for h2c
ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"],
socket: httpSocket,
// upgrade socket connection
port,
host: hostname
});
socket.on("session", function(session2) {
sessionCache.set(sessionKey, session2);
});
} else {
assert(!httpSocket, "httpSocket can only be sent on TLS update");
port = port || 80;
socket = net.connect({
highWaterMark: 64 * 1024,
// Same as nodejs fs streams.
...options,
localAddress,
port,
host: hostname
});
}
if (options.keepAlive == null || options.keepAlive) {
const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay;
socket.setKeepAlive(true, keepAliveInitialDelay);
}
const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port });
socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() {
queueMicrotask(clearConnectTimeout);
if (callback) {
const cb = callback;
callback = null;
cb(null, this);
}
}).on("error", function(err) {
queueMicrotask(clearConnectTimeout);
if (callback) {
const cb = callback;
callback = null;
cb(err);
}
});
return socket;
};
}
var setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => {
if (!opts.timeout) {
return noop;
}
let s1 = null;
let s2 = null;
const fastTimer = timers.setFastTimeout(() => {
s1 = setImmediate(() => {
s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts));
});
}, opts.timeout);
return () => {
timers.clearFastTimeout(fastTimer);
clearImmediate(s1);
clearImmediate(s2);
};
} : (socketWeakRef, opts) => {
if (!opts.timeout) {
return noop;
}
let s1 = null;
const fastTimer = timers.setFastTimeout(() => {
s1 = setImmediate(() => {
onConnectTimeout(socketWeakRef.deref(), opts);
});
}, opts.timeout);
return () => {
timers.clearFastTimeout(fastTimer);
clearImmediate(s1);
};
};
function onConnectTimeout(socket, opts) {
if (socket == null) {
return;
}
let message = "Connect Timeout Error";
if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")},`;
} else {
message += ` (attempted address: ${opts.hostname}:${opts.port},`;
}
message += ` timeout: ${opts.timeout}ms)`;
util.destroy(socket, new ConnectTimeoutError(message));
}
module2.exports = buildConnector;
}
});
// node_modules/undici/lib/llhttp/utils.js
var require_utils = __commonJS({
"node_modules/undici/lib/llhttp/utils.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.enumToMap = void 0;
function enumToMap(obj) {
const res = {};
Object.keys(obj).forEach((key) => {
const value = obj[key];
if (typeof value === "number") {
res[key] = value;
}
});
return res;
}
exports2.enumToMap = enumToMap;
}
});
// node_modules/undici/lib/llhttp/constants.js
var require_constants2 = __commonJS({
"node_modules/undici/lib/llhttp/constants.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0;
var utils_1 = require_utils();
var ERROR;
(function(ERROR2) {
ERROR2[ERROR2["OK"] = 0] = "OK";
ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL";
ERROR2[ERROR2["STRICT"] = 2] = "STRICT";
ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED";
ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH";
ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION";
ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD";
ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL";
ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT";
ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION";
ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN";
ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH";
ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE";
ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS";
ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE";
ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING";
ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN";
ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE";
ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE";
ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER";
ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE";
ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED";
ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE";
ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE";
ERROR2[ERROR2["USER"] = 24] = "USER";
})(ERROR = exports2.ERROR || (exports2.ERROR = {}));
var TYPE;
(function(TYPE2) {
TYPE2[TYPE2["BOTH"] = 0] = "BOTH";
TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST";
TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE";
})(TYPE = exports2.TYPE || (exports2.TYPE = {}));
var FLAGS;
(function(FLAGS2) {
FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE";
FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE";
FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE";
FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED";
FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE";
FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH";
FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY";
FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING";
FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING";
})(FLAGS = exports2.FLAGS || (exports2.FLAGS = {}));
var LENIENT_FLAGS;
(function(LENIENT_FLAGS2) {
LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS";
LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH";
LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE";
})(LENIENT_FLAGS = exports2.LENIENT_FLAGS || (exports2.LENIENT_FLAGS = {}));
var METHODS;
(function(METHODS2) {
METHODS2[METHODS2["DELETE"] = 0] = "DELETE";
METHODS2[METHODS2["GET"] = 1] = "GET";
METHODS2[METHODS2["HEAD"] = 2] = "HEAD";
METHODS2[METHODS2["POST"] = 3] = "POST";
METHODS2[METHODS2["PUT"] = 4] = "PUT";
METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT";
METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS";
METHODS2[METHODS2["TRACE"] = 7] = "TRACE";
METHODS2[METHODS2["COPY"] = 8] = "COPY";
METHODS2[METHODS2["LOCK"] = 9] = "LOCK";
METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL";
METHODS2[METHODS2["MOVE"] = 11] = "MOVE";
METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND";
METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH";
METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH";
METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK";
METHODS2[METHODS2["BIND"] = 16] = "BIND";
METHODS2[METHODS2["REBIND"] = 17] = "REBIND";
METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND";
METHODS2[METHODS2["ACL"] = 19] = "ACL";
METHODS2[METHODS2["REPORT"] = 20] = "REPORT";
METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY";
METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT";
METHODS2[METHODS2["MERGE"] = 23] = "MERGE";
METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH";
METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY";
METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE";
METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE";
METHODS2[METHODS2["PATCH"] = 28] = "PATCH";
METHODS2[METHODS2["PURGE"] = 29] = "PURGE";
METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR";
METHODS2[METHODS2["LINK"] = 31] = "LINK";
METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK";
METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE";
METHODS2[METHODS2["PRI"] = 34] = "PRI";
METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE";
METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE";
METHODS2[METHODS2["SETUP"] = 37] = "SETUP";
METHODS2[METHODS2["PLAY"] = 38] = "PLAY";
METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE";
METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN";
METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER";
METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER";
METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT";
METHODS2[METHODS2["RECORD"] = 44] = "RECORD";
METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH";
})(METHODS = exports2.METHODS || (exports2.METHODS = {}));
exports2.METHODS_HTTP = [
METHODS.DELETE,
METHODS.GET,
METHODS.HEAD,
METHODS.POST,
METHODS.PUT,
METHODS.CONNECT,
METHODS.OPTIONS,
METHODS.TRACE,
METHODS.COPY,
METHODS.LOCK,
METHODS.MKCOL,
METHODS.MOVE,
METHODS.PROPFIND,
METHODS.PROPPATCH,
METHODS.SEARCH,
METHODS.UNLOCK,
METHODS.BIND,
METHODS.REBIND,
METHODS.UNBIND,
METHODS.ACL,
METHODS.REPORT,
METHODS.MKACTIVITY,
METHODS.CHECKOUT,
METHODS.MERGE,
METHODS["M-SEARCH"],
METHODS.NOTIFY,
METHODS.SUBSCRIBE,
METHODS.UNSUBSCRIBE,
METHODS.PATCH,
METHODS.PURGE,
METHODS.MKCALENDAR,
METHODS.LINK,
METHODS.UNLINK,
METHODS.PRI,
// TODO(indutny): should we allow it with HTTP?
METHODS.SOURCE
];
exports2.METHODS_ICE = [
METHODS.SOURCE
];
exports2.METHODS_RTSP = [
METHODS.OPTIONS,
METHODS.DESCRIBE,
METHODS.ANNOUNCE,
METHODS.SETUP,
METHODS.PLAY,
METHODS.PAUSE,
METHODS.TEARDOWN,
METHODS.GET_PARAMETER,
METHODS.SET_PARAMETER,
METHODS.REDIRECT,
METHODS.RECORD,
METHODS.FLUSH,
// For AirPlay
METHODS.GET,
METHODS.POST
];
exports2.METHOD_MAP = utils_1.enumToMap(METHODS);
exports2.H_METHOD_MAP = {};
Object.keys(exports2.METHOD_MAP).forEach((key) => {
if (/^H/.test(key)) {
exports2.H_METHOD_MAP[key] = exports2.METHOD_MAP[key];
}
});
var FINISH;
(function(FINISH2) {
FINISH2[FINISH2["SAFE"] = 0] = "SAFE";
FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB";
FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE";
})(FINISH = exports2.FINISH || (exports2.FINISH = {}));
exports2.ALPHA = [];
for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) {
exports2.ALPHA.push(String.fromCharCode(i));
exports2.ALPHA.push(String.fromCharCode(i + 32));
}
exports2.NUM_MAP = {
0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 6,
7: 7,
8: 8,
9: 9
};
exports2.HEX_MAP = {
0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 6,
7: 7,
8: 8,
9: 9,
A: 10,
B: 11,
C: 12,
D: 13,
E: 14,
F: 15,
a: 10,
b: 11,
c: 12,
d: 13,
e: 14,
f: 15
};
exports2.NUM = [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
];
exports2.ALPHANUM = exports2.ALPHA.concat(exports2.NUM);
exports2.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"];
exports2.USERINFO_CHARS = exports2.ALPHANUM.concat(exports2.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]);
exports2.STRICT_URL_CHAR = [
"!",
'"',
"$",
"%",
"&",
"'",
"(",
")",
"*",
"+",
",",
"-",
".",
"/",
":",
";",
"<",
"=",
">",
"@",
"[",
"\\",
"]",
"^",
"_",
"`",
"{",
"|",
"}",
"~"
].concat(exports2.ALPHANUM);
exports2.URL_CHAR = exports2.STRICT_URL_CHAR.concat([" ", "\f"]);
for (let i = 128; i <= 255; i++) {
exports2.URL_CHAR.push(i);
}
exports2.HEX = exports2.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]);
exports2.STRICT_TOKEN = [
"!",
"#",
"$",
"%",
"&",
"'",
"*",
"+",
"-",
".",
"^",
"_",
"`",
"|",
"~"
].concat(exports2.ALPHANUM);
exports2.TOKEN = exports2.STRICT_TOKEN.concat([" "]);
exports2.HEADER_CHARS = [" "];
for (let i = 32; i <= 255; i++) {
if (i !== 127) {
exports2.HEADER_CHARS.push(i);
}
}
exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS.filter((c) => c !== 44);
exports2.MAJOR = exports2.NUM_MAP;
exports2.MINOR = exports2.MAJOR;
var HEADER_STATE;
(function(HEADER_STATE2) {
HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL";
HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION";
HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH";
HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING";
HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE";
HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE";
HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE";
HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE";
HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED";
})(HEADER_STATE = exports2.HEADER_STATE || (exports2.HEADER_STATE = {}));
exports2.SPECIAL_HEADERS = {
"connection": HEADER_STATE.CONNECTION,
"content-length": HEADER_STATE.CONTENT_LENGTH,
"proxy-connection": HEADER_STATE.CONNECTION,
"transfer-encoding": HEADER_STATE.TRANSFER_ENCODING,
"upgrade": HEADER_STATE.UPGRADE
};
}
});
// node_modules/undici/lib/llhttp/llhttp-wasm.js
var require_llhttp_wasm = __commonJS({
"node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) {
"use strict";
var { Buffer: Buffer2 } = require("node:buffer");
module2.exports = Buffer2.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDsYBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHyAhIyUmKCorLC8wMTIzNDU2Nzk6Ozw9lANAQkRFRklLTk9QUVJTVFVWWFpbXF1eX2BhYmNkZWZnaGpsb3Bxc3V2eHl6e3x/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcsBzAHNAc4BzwGKA4kDiAOHA4QDgwOAA/sC+gL5AvgC9wL0AvMC8gLLAsECsALZAQsgASAERw3wAkHdASEDDLMDCyABIARHDcgBQcMBIQMMsgMLIAEgBEcNe0H3ACEDDLEDCyABIARHDXBB7wAhAwywAwsgASAERw1pQeoAIQMMrwMLIAEgBEcNZUHoACEDDK4DCyABIARHDWJB5gAhAwytAwsgASAERw0aQRghAwysAwsgASAERw0VQRIhAwyrAwsgASAERw1CQcUAIQMMqgMLIAEgBEcNNEE/IQMMqQMLIAEgBEcNMkE8IQMMqAMLIAEgBEcNK0ExIQMMpwMLIAItAC5BAUYNnwMMwQILQQAhAAJAAkACQCACLQAqRQ0AIAItACtFDQAgAi8BMCIDQQJxRQ0BDAILIAIvATAiA0EBcUUNAQtBASEAIAItAChBAUYNACACLwEyIgVB5ABrQeQASQ0AIAVBzAFGDQAgBUGwAkYNACADQcAAcQ0AQQAhACADQYgEcUGABEYNACADQShxQQBHIQALIAJBADsBMCACQQA6AC8gAEUN3wIgAkIANwMgDOACC0EAIQACQCACKAI4IgNFDQAgAygCLCIDRQ0AIAIgAxEAACEACyAARQ3MASAAQRVHDd0CIAJBBDYCHCACIAE2AhQgAkGwGDYCECACQRU2AgxBACEDDKQDCyABIARGBEBBBiEDDKQDCyABQQFqIQFBACEAAkAgAigCOCIDRQ0AIAMoAlQiA0UNACACIAMRAAAhAAsgAA3ZAgwcCyACQgA3AyBBEiEDDIkDCyABIARHDRZBHSEDDKEDCyABIARHBEAgAUEBaiEBQRAhAwyIAwtBByEDDKADCyACIAIpAyAiCiAEIAFrrSILfSIMQgAgCiAMWhs3AyAgCiALWA3UAkEIIQMMnwMLIAEgBEcEQCACQQk2AgggAiABNgIEQRQhAwyGAwtBCSEDDJ4DCyACKQMgQgBSDccBIAIgAi8BMEGAAXI7ATAMQgsgASAERw0/QdAAIQMMnAMLIAEgBEYEQEELIQMMnAMLIAFBAWohAUEAIQACQCACKAI4IgNFDQAgAygCUCIDRQ0AIAIgAxEAACEACyAADc8CDMYBC0EAIQACQCACKAI4IgNFDQAgAygCSCIDRQ0AIAIgAxEAACEACyAARQ3GASAAQRVHDc0CIAJBCzYCHCACIAE2AhQgAkGCGTYCECACQRU2AgxBACEDDJoDC0EAIQACQCACKAI4IgNFDQAgAygCSCIDRQ0AIAIgAxEAACEACyAARQ0MIABBFUcNygIgAkEaNgIcIAIgATYCFCACQYIZNgIQIAJBFTYCDEEAIQMMmQMLQQAhAAJAIAIoAjgiA0UNACADKAJMIgNFDQAgAiADEQAAIQALIABFDcQBIABBFUcNxwIgAkELNgIcIAIgATYCFCACQZEXNgIQIAJBFTYCDEEAIQMMmAMLIAEgBEYEQEEPIQMMmAMLIAEtAAAiAEE7Rg0HIABBDUcNxAIgAUEBaiEBDMMBC0EAIQACQCACKAI4IgNFDQAgAygCTCIDRQ0AIAIgAxEAACEACyAARQ3DASAAQRVHDcICIAJBDzYCHCACIAE2AhQgAkGRFzYCECACQRU2AgxBACEDDJYDCwNAIAEtAABB8DVqLQAAIgBBAUcEQCAAQQJHDcECIAIoAgQhAEEAIQMgAkEANgIEIAIgACABQQFqIgEQLSIADcICDMUBCyAEIAFBAWoiAUcNAAtBEiEDDJUDC0EAIQACQCACKAI4IgNFDQAgAygCTCIDRQ0AIAIgAxEAACEACyAARQ3FASAAQRVHDb0CIAJBGzYCHCACIAE2AhQgAkGRFzYCECACQRU2AgxBACEDDJQDCyABIARGBEBBFiEDDJQDCyACQQo2AgggAiABNgIEQQAhAAJAIAIoAjgiA0UNACADKAJIIgNFDQAgAiADEQAAIQALIABFDcIBIABBFUcNuQIgAkEVNgIcIAIgATYCFCACQYIZNgIQIAJBFTYCDEEAIQMMkwMLIAEgBEcEQANAIAEtAABB8DdqLQAAIgBBAkcEQAJAIABBAWsOBMQCvQIAvgK9AgsgAUEBaiEBQQghAwz8AgsgBCABQQFqIgFHDQALQRUhAwyTAwtBFSEDDJIDCwNAIAEtAABB8DlqLQAAIgBBAkcEQCAAQQFrDgTFArcCwwK4ArcCCyAEIAFBAWoiAUcNAAtBGCEDDJEDCyABIARHBEAgAkELNgIIIAIgATYCBEEHIQMM+AILQRkhAwyQAwsgAUEBaiEBDAILIAEgBEYEQEEaIQMMjwMLAkAgAS0AAEENaw4UtQG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwEAvwELQQAhAyACQQA2AhwgAkGvCzYCECACQQI2AgwgAiABQQFqNgIUDI4DCyABIARGBEBBGyEDDI4DCyABLQAAIgBBO0cEQCAAQQ1HDbECIAFBAWohAQy6AQsgAUEBaiEBC0EiIQMM8wILIAEgBEYEQEEcIQMMjAMLQgAhCgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0AAEEwaw43wQLAAgABAgMEBQYH0AHQAdAB0AHQAdAB0AEICQoLDA3QAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdABDg8QERIT0AELQgIhCgzAAgtCAyEKDL8CC0IEIQoMvgILQgUhCgy9AgtCBiEKDLwCC0IHIQoMuwILQgghCgy6AgtCCSEKDLkCC0IKIQoMuAILQgshCgy3AgtCDCEKDLYCC0INIQoMtQILQg4hCgy0AgtCDyEKDLMCC0IKIQoMsgILQgshCgyxAgtCDCEKDLACC0INIQoMrwILQg4hCgyuAgtCDyEKDK0CC0IAIQoCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAABBMGsON8ACvwIAAQIDBAUGB74CvgK+Ar4CvgK+Ar4CCAkKCwwNvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ag4PEBESE74CC0ICIQoMvwILQgMhCgy+AgtCBCEKDL0CC0IFIQoMvAILQgYhCgy7AgtCByEKDLoCC0IIIQoMuQILQgkhCgy4AgtCCiEKDLcCC0ILIQoMtgILQgwhCgy1AgtCDSEKDLQCC0IOIQoMswILQg8hCgyyAgtCCiEKDLECC0ILIQoMsAILQgwhCgyvAgtCDSEKDK4CC0IOIQoMrQILQg8hCgysAgsgAiACKQMgIgogBCABa60iC30iDEIAIAogDFobNwMgIAogC1gNpwJBHyEDDIkDCyABIARHBEAgAkEJNgIIIAIgATYCBEElIQMM8AILQSAhAwyIAwtBASEFIAIvATAiA0EIcUUEQCACKQMgQgBSIQULAkAgAi0ALgRAQQEhACACLQApQQVGDQEgA0HAAHFFIAVxRQ0BC0EAIQAgA0HAAHENAEECIQAgA0EIcQ0AIANBgARxBEACQCACLQAoQQFHDQAgAi0ALUEKcQ0AQQUhAAwCC0EEIQAMAQsgA0EgcUUEQAJAIAItAChBAUYNACACLwEyIgBB5ABrQeQASQ0AIABBzAFGDQAgAEGwAkYNAEEEIQAgA0EocUUNAiADQYgEcUGABEYNAgtBACEADAELQQBBAyACKQMgUBshAAsgAEEBaw4FvgIAsAEBpAKhAgtBESEDDO0CCyACQQE6AC8MhAMLIAEgBEcNnQJBJCEDDIQDCyABIARHDRxBxgAhAwyDAwtBACEAAkAgAigCOCIDRQ0AIAMoAkQiA0UNACACIAMRAAAhAAsgAEUNJyAAQRVHDZgCIAJB0AA2AhwgAiABNgIUIAJBkRg2AhAgAkEVNgIMQQAhAwyCAwsgASAERgRAQSghAwyCAwtBACEDIAJBADYCBCACQQw2AgggAiABIAEQKiIARQ2UAiACQSc2AhwgAiABNgIUIAIgADYCDAyBAwsgASAERgRAQSkhAwyBAwsgAS0AACIAQSBGDRMgAEEJRw2VAiABQQFqIQEMFAsgASAERwRAIAFBAWohAQwWC0EqIQMM/wILIAEgBEYEQEErIQMM/wILIAEtAAAiAEEJRyAAQSBHcQ2QAiACLQAsQQhHDd0CIAJBADoALAzdAgsgASAERgRAQSwhAwz+AgsgAS0AAEEKRw2OAiABQQFqIQEMsAELIAEgBEcNigJBLyEDDPwCCwNAIAEtAAAiAEEgRwRAIABBCmsOBIQCiAKIAoQChgILIAQgAUEBaiIBRw0AC0ExIQMM+wILQTIhAyABIARGDfoCIAIoAgAiACAEIAFraiEHIAEgAGtBA2ohBgJAA0AgAEHwO2otAAAgAS0AACIFQSByIAUgBUHBAGtB/wFxQRpJG0H/AXFHDQEgAEEDRgRAQQYhAQziAgsgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAc2AgAM+wILIAJBADYCAAyGAgtBMyEDIAQgASIARg35AiAEIAFrIAIoAgAiAWohByAAIAFrQQhqIQYCQANAIAFB9DtqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw0BIAFBCEYEQEEFIQEM4QILIAFBAWohASAEIABBAWoiAEcNAAsgAiAHNgIADPoCCyACQQA2AgAgACEBDIUCC0E0IQMgBCABIgBGDfgCIAQgAWsgAigCACIBaiEHIAAgAWtBBWohBgJAA0AgAUHQwgBqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw0BIAFBBUYEQEEHIQEM4AILIAFBAWohASAEIABBAWoiAEcNAAsgAiAHNgIADPkCCyACQQA2AgAgACEBDIQCCyABIARHBEADQCABLQAAQYA+ai0AACIAQQFHBEAgAEECRg0JDIECCyAEIAFBAWoiAUcNAAtBMCEDDPgCC0EwIQMM9wILIAEgBEcEQANAIAEtAAAiAEEgRwRAIABBCmsOBP8B/gH+Af8B/gELIAQgAUEBaiIBRw0AC0E4IQMM9wILQTghAwz2AgsDQCABLQAAIgBBIEcgAEEJR3EN9gEgBCABQQFqIgFHDQALQTwhAwz1AgsDQCABLQAAIgBBIEcEQAJAIABBCmsOBPkBBAT5AQALIABBLEYN9QEMAwsgBCABQQFqIgFHDQALQT8hAwz0AgtBwAAhAyABIARGDfMCIAIoAgAiACAEIAFraiEFIAEgAGtBBmohBgJAA0AgAEGAQGstAAAgAS0AAEEgckcNASAAQQZGDdsCIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADPQCCyACQQA2AgALQTYhAwzZAgsgASAERgRAQcEAIQMM8gILIAJBDDYCCCACIAE2AgQgAi0ALEEBaw4E+wHuAewB6wHUAgsgAUEBaiEBDPoBCyABIARHBEADQAJAIAEtAAAiAEEgciAAIABBwQBrQf8BcUEaSRtB/wFxIgBBCUYNACAAQSBGDQACQAJAAkACQCAAQeMAaw4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIQMM3AILIAFBAWohAUEyIQMM2wILIAFBAWohAUEzIQMM2gILDP4BCyAEIAFBAWoiAUcNAAtBNSEDDPACC0E1IQMM7wILIAEgBEcEQANAIAEtAABBgDxqLQAAQQFHDfcBIAQgAUEBaiIBRw0AC0E9IQMM7wILQT0hAwzuAgtBACEAAkAgAigCOCIDRQ0AIAMoAkAiA0UNACACIAMRAAAhAAsgAEUNASAAQRVHDeYBIAJBwgA2AhwgAiABNgIUIAJB4xg2AhAgAkEVNgIMQQAhAwztAgsgAUEBaiEBC0E8IQMM0gILIAEgBEYEQEHCACEDDOsCCwJAA0ACQCABLQAAQQlrDhgAAswCzALRAswCzALMAswCzALMAswCzALMAswCzALMAswCzALMAswCzALMAgDMAgsgBCABQQFqIgFHDQALQcIAIQMM6wILIAFBAWohASACLQAtQQFxRQ3+AQtBLCEDDNACCyABIARHDd4BQcQAIQMM6AILA0AgAS0AAEGQwABqLQAAQQFHDZwBIAQgAUEBaiIBRw0AC0HFACEDDOcCCyABLQAAIgBBIEYN/gEgAEE6Rw3AAiACKAIEIQBBACEDIAJBADYCBCACIAAgARApIgAN3gEM3QELQccAIQMgBCABIgBGDeUCIAQgAWsgAigCACIBaiEHIAAgAWtBBWohBgNAIAFBkMIAai0AACAALQAAIgVBIHIgBSAFQcEAa0H/AXFBGkkbQf8BcUcNvwIgAUEFRg3CAiABQQFqIQEgBCAAQQFqIgBHDQALIAIgBzYCAAzlAgtByAAhAyAEIAEiAEYN5AIgBCABayACKAIAIgFqIQcgACABa0EJaiEGA0AgAUGWwgBqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw2+AkECIAFBCUYNwgIaIAFBAWohASAEIABBAWoiAEcNAAsgAiAHNgIADOQCCyABIARGBEBByQAhAwzkAgsCQAJAIAEtAAAiAEEgciAAIABBwQBrQf8BcUEaSRtB/wFxQe4Aaw4HAL8CvwK/Ar8CvwIBvwILIAFBAWohAUE+IQMMywILIAFBAWohAUE/IQMMygILQcoAIQMgBCABIgBGDeICIAQgAWsgAigCACIBaiEGIAAgAWtBAWohBwNAIAFBoMIAai0AACAALQAAIgVBIHIgBSAFQcEAa0H/AXFBGkkbQf8BcUcNvAIgAUEBRg2+AiABQQFqIQEgBCAAQQFqIgBHDQALIAIgBjYCAAziAgtBywAhAyAEIAEiAEYN4QIgBCABayACKAIAIgFqIQcgACABa0EOaiEGA0AgAUGiwgBqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw27AiABQQ5GDb4CIAFBAWohASAEIABBAWoiAEcNAAsgAiAHNgIADOECC0HMACEDIAQgASIARg3gAiAEIAFrIAIoAgAiAWohByAAIAFrQQ9qIQYDQCABQcDCAGotAAAgAC0AACIFQSByIAUgBUHBAGtB/wFxQRpJG0H/AXFHDboCQQMgAUEPRg2+AhogAUEBaiEBIAQgAEEBaiIARw0ACyACIAc2AgAM4AILQc0AIQMgBCABIgBGDd8CIAQgAWsgAigCACIBaiEHIAAgAWtBBWohBgNAIAFB0MIAai0AACAALQAAIgVBIHIgBSAFQcEAa0H/AXFBGkkbQf8BcUcNuQJBBCABQQVGDb0CGiABQQFqIQEgBCAAQQFqIgBHDQALIAIgBzYCAAzfAgsgASAERgRAQc4AIQMM3wILAkACQAJAAkAgAS0AACIAQSByIAAgAEHBAGtB/wFxQRpJG0H/AXFB4wBrDhMAvAK8ArwCvAK8ArwCvAK8ArwCvAK8ArwCAbwCvAK8AgIDvAILIAFBAWohAUHBACEDDMgCCyABQQFqIQFBwgAhAwzHAgsgAUEBaiEBQcMAIQMMxgILIAFBAWohAUHEACEDDMUCCyABIARHBEAgAkENNgIIIAIgATYCBEHFACEDDMUCC0HPACEDDN0CCwJAAkAgAS0AAEEKaw4EAZABkAEAkAELIAFBAWohAQtBKCEDDMMCCyABIARGBEBB0QAhAwzcAgsgAS0AAEEgRw0AIAFBAWohASACLQAtQQFxRQ3QAQtBFyEDDMECCyABIARHDcsBQdIAIQMM2QILQdMAIQMgASAERg3YAiACKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABB1sIAai0AAEcNxwEgAEEBRg3KASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBjYCAAzYAgsgASAERgRAQdUAIQMM2AILIAEtAABBCkcNwgEgAUEBaiEBDMoBCyABIARGBEBB1gAhAwzXAgsCQAJAIAEtAABBCmsOBADDAcMBAcMBCyABQQFqIQEMygELIAFBAWohAUHKACEDDL0CC0EAIQACQCACKAI4IgNFDQAgAygCPCIDRQ0AIAIgAxEAACEACyAADb8BQc0AIQMMvAILIAItAClBIkYNzwIMiQELIAQgASIFRgRAQdsAIQMM1AILQQAhAEEBIQFBASEGQQAhAwJAAn8CQAJAAkACQAJAAkACQCAFLQAAQTBrDgrFAcQBAAECAwQFBgjDAQtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshA0EAIQFBACEGDL0BC0EJIQNBASEAQQAhAUEAIQYMvAELIAEgBEYEQEHdACEDDNMCCyABLQAAQS5HDbgBIAFBAWohAQyIAQsgASAERw22AUHfACEDDNECCyABIARHBEAgAkEONgIIIAIgATYCBEHQACEDDLgCC0HgACEDDNACC0HhACEDIAEgBEYNzwIgAigCACIAIAQgAWtqIQUgASAAa0EDaiEGA0AgAS0AACAAQeLCAGotAABHDbEBIABBA0YNswEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMzwILQeIAIQMgASAERg3OAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYDQCABLQAAIABB5sIAai0AAEcNsAEgAEECRg2vASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAzOAgtB4wAhAyABIARGDc0CIAIoAgAiACAEIAFraiEFIAEgAGtBA2ohBgNAIAEtAAAgAEHpwgBqLQAARw2vASAAQQNGDa0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADM0CCyABIARGBEBB5QAhAwzNAgsgAUEBaiEBQQAhAAJAIAIoAjgiA0UNACADKAIwIgNFDQAgAiADEQAAIQALIAANqgFB1gAhAwyzAgsgASAERwRAA0AgAS0AACIAQSBHBEACQAJAAkAgAEHIAGsOCwABswGzAbMBswGzAbMBswGzAQKzAQsgAUEBaiEBQdIAIQMMtwILIAFBAWohAUHTACEDDLYCCyABQQFqIQFB1AAhAwy1AgsgBCABQQFqIgFHDQALQeQAIQMMzAILQeQAIQMMywILA0AgAS0AAEHwwgBqLQAAIgBBAUcEQCAAQQJrDgOnAaYBpQGkAQsgBCABQQFqIgFHDQALQeYAIQMMygILIAFBAWogASAERw0CGkHnACEDDMkCCwNAIAEtAABB8MQAai0AACIAQQFHBEACQCAAQQJrDgSiAaEBoAEAnwELQdcAIQMMsQILIAQgAUEBaiIBRw0AC0HoACEDDMgCCyABIARGBEBB6QAhAwzIAgsCQCABLQAAIgBBCmsOGrcBmwGbAbQBmwGbAZsBmwGbAZsBmwGbAZsBmwGbAZsBmwGbAZsBmwGbAZsBpAGbAZsBAJkBCyABQQFqCyEBQQYhAwytAgsDQCABLQAAQfDGAGotAABBAUcNfSAEIAFBAWoiAUcNAAtB6gAhAwzFAgsgAUEBaiABIARHDQIaQesAIQMMxAILIAEgBEYEQEHsACEDDMQCCyABQQFqDAELIAEgBEYEQEHtACEDDMMCCyABQQFqCyEBQQQhAwyoAgsgASAERgRAQe4AIQMMwQILAkACQAJAIAEtAABB8MgAai0AAEEBaw4HkAGPAY4BAHwBAo0BCyABQQFqIQEMCwsgAUEBagyTAQtBACEDIAJBADYCHCACQZsSNgIQIAJBBzYCDCACIAFBAWo2AhQMwAILAkADQCABLQAAQfDIAGotAAAiAEEERwRAAkACQCAAQQFrDgeUAZMBkgGNAQAEAY0BC0HaACEDDKoCCyABQQFqIQFB3AAhAwypAgsgBCABQQFqIgFHDQALQe8AIQMMwAILIAFBAWoMkQELIAQgASIARgRAQfAAIQMMvwILIAAtAABBL0cNASAAQQFqIQEMBwsgBCABIgBGBEBB8QAhAwy+AgsgAC0AACIBQS9GBEAgAEEBaiEBQd0AIQMMpQILIAFBCmsiA0EWSw0AIAAhAUEBIAN0QYmAgAJxDfkBC0EAIQMgAkEANgIcIAIgADYCFCACQYwcNgIQIAJBBzYCDAy8AgsgASAERwRAIAFBAWohAUHeACEDDKMCC0HyACEDDLsCCyABIARGBEBB9AAhAwy7AgsCQCABLQAAQfDMAGotAABBAWsOA/cBcwCCAQtB4QAhAwyhAgsgASAERwRAA0AgAS0AAEHwygBqLQAAIgBBA0cEQAJAIABBAWsOAvkBAIUBC0HfACEDDKMCCyAEIAFBAWoiAUcNAAtB8wAhAwy6AgtB8wAhAwy5AgsgASAERwRAIAJBDzYCCCACIAE2AgRB4AAhAwygAgtB9QAhAwy4AgsgASAERgRAQfYAIQMMuAILIAJBDzYCCCACIAE2AgQLQQMhAwydAgsDQCABLQAAQSBHDY4CIAQgAUEBaiIBRw0AC0H3ACEDDLUCCyABIARGBEBB+AAhAwy1AgsgAS0AAEEgRw16IAFBAWohAQxbC0EAIQACQCACKAI4IgNFDQAgAygCOCIDRQ0AIAIgAxEAACEACyAADXgMgAILIAEgBEYEQEH6ACEDDLMCCyABLQAAQcwARw10IAFBAWohAUETDHYLQfsAIQMgASAERg2xAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYDQCABLQAAIABB8M4Aai0AAEcNcyAAQQVGDXUgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMsQILIAEgBEYEQEH8ACEDDLECCwJAAkAgAS0AAEHDAGsODAB0dHR0dHR0dHR0AXQLIAFBAWohAUHmACEDDJgCCyABQQFqIQFB5wAhAwyXAgtB/QAhAyABIARGDa8CIAIoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQe3PAGotAABHDXIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADLACCyACQQA2AgAgBkEBaiEBQRAMcwtB/gAhAyABIARGDa4CIAIoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQfbOAGotAABHDXEgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADK8CCyACQQA2AgAgBkEBaiEBQRYMcgtB/wAhAyABIARGDa0CIAIoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQfzOAGotAABHDXAgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADK4CCyACQQA2AgAgBkEBaiEBQQUMcQsgASAERgRAQYABIQMMrQILIAEtAABB2QBHDW4gAUEBaiEBQQgMcAsgASAERgRAQYEBIQMMrAILAkACQCABLQAAQc4Aaw4DAG8BbwsgAUEBaiEBQesAIQMMkwILIAFBAWohAUHsACEDDJICCyABIARGBEBBggEhAwyrAgsCQAJAIAEtAABByABrDggAbm5ubm5uAW4LIAFBAWohAUHqACEDDJICCyABQQFqIQFB7QAhAwyRAgtBgwEhAyABIARGDakCIAIoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQYDPAGotAABHDWwgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADKoCCyACQQA2AgAgBkEBaiEBQQAMbQtBhAEhAyABIARGDagCIAIoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQYPPAGotAABHDWsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADKkCCyACQQA2AgAgBkEBaiEBQSMMbAsgASAERgRAQYUBIQMMqAILAkACQCABLQAAQcwAaw4IAGtra2trawFrCyABQQFqIQFB7wAhAwyPAgsgAUEBaiEBQfAAIQMMjgILIAEgBEYEQEGGASEDDKcCCyABLQAAQcUARw1oIAFBAWohAQxgC0GHASEDIAEgBEYNpQIgAigCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBiM8Aai0AAEcNaCAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMpgILIAJBADYCACAGQQFqIQFBLQxpC0GIASEDIAEgBEYNpAIgAigCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABB0M8Aai0AAEcNZyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMpQILIAJBADYCACAGQQFqIQFBKQxoCyABIARGBEBBiQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB9ysPC0GQMQ8LQdcxDwtBoi0PC0HUJw8LQeArDwtBnywPC0HrMQ8LQdUfDwtByjEPC0HeJQ8LQdQeDwtB9BwPC0GnMg8LQbEdDwtBoB0PC0G5MQ8LQbwwDwtBkiEPC0GzJg8LQeksDwtBrB4PC0HUKw8LQfcmDwtBgCYPC0GwIQ8LQf4eDwtBjSMPC0GJLQ8LQfciDwtBoDEPC0GuHw8LQcYlDwtB6B4PC0GTIg8LQcIvDwtBwx0PC0GLLA8LQeEdDwtBjS8PC0HqIQ8LQbQtDwtB0i8PC0HfMg8LQdIyDwtB8DAPC0GpIg8LQfkjDwtBmR4PC0G1LA8LQZswDwtBkjIPC0G2Kw8LQcIiDwtB+DIPC0GeJQ8LQdAiDwtBuh4PC0GBHg8LAAtB1iEhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCz4BAn8CQCAAKAI4IgNFDQAgAygCBCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBxhE2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCCCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB9go2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCDCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB7Ro2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCECIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBlRA2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCFCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBqhs2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCGCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB7RM2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCKCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB9gg2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCHCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBwhk2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCICIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBlBQ2AhBBGCEECyAEC1kBAn8CQCAALQAoQQFGDQAgAC8BMiIBQeQAa0HkAEkNACABQcwBRg0AIAFBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhAiAAQYgEcUGABEYNACAAQShxRSECCyACC4wBAQJ/AkACQAJAIAAtACpFDQAgAC0AK0UNACAALwEwIgFBAnFFDQEMAgsgAC8BMCIBQQFxRQ0BC0EBIQIgAC0AKEEBRg0AIAAvATIiAEHkAGtB5ABJDQAgAEHMAUYNACAAQbACRg0AIAFBwABxDQBBACECIAFBiARxQYAERg0AIAFBKHFBAEchAgsgAgtXACAAQRhqQgA3AwAgAEIANwMAIABBOGpCADcDACAAQTBqQgA3AwAgAEEoakIANwMAIABBIGpCADcDACAAQRBqQgA3AwAgAEEIakIANwMAIABB3QE2AhwLBgAgABAyC5otAQt/IwBBEGsiCiQAQaTQACgCACIJRQRAQeTTACgCACIFRQRAQfDTAEJ/NwIAQejTAEKAgISAgIDAADcCAEHk0wAgCkEIakFwcUHYqtWqBXMiBTYCAEH40wBBADYCAEHI0wBBADYCAAtBzNMAQYDUBDYCAEGc0ABBgNQENgIAQbDQACAFNgIAQazQAEF/NgIAQdDTAEGArAM2AgADQCABQcjQAGogAUG80ABqIgI2AgAgAiABQbTQAGoiAzYCACABQcDQAGogAzYCACABQdDQAGogAUHE0ABqIgM2AgAgAyACNgIAIAFB2NAAaiABQczQAGoiAjYCACACIAM2AgAgAUHU0ABqIAI2AgAgAUEgaiIBQYACRw0AC0GM1ARBwasDNgIAQajQAEH00wAoAgA2AgBBmNAAQcCrAzYCAEGk0ABBiNQENgIAQcz/B0E4NgIAQYjUBCEJCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFNBEBBjNAAKAIAIgZBECAAQRNqQXBxIABBC0kbIgRBA3YiAHYiAUEDcQRAAkAgAUEBcSAAckEBcyICQQN0IgBBtNAAaiIBIABBvNAAaigCACIAKAIIIgNGBEBBjNAAIAZBfiACd3E2AgAMAQsgASADNgIIIAMgATYCDAsgAEEIaiEBIAAgAkEDdCICQQNyNgIEIAAgAmoiACAAKAIEQQFyNgIEDBELQZTQACgCACIIIARPDQEgAQRAAkBBAiAAdCICQQAgAmtyIAEgAHRxaCIAQQN0IgJBtNAAaiIBIAJBvNAAaigCACICKAIIIgNGBEBBjNAAIAZBfiAAd3EiBjYCAAwBCyABIAM2AgggAyABNgIMCyACIARBA3I2AgQgAEEDdCIAIARrIQUgACACaiAFNgIAIAIgBGoiBCAFQQFyNgIEIAgEQCAIQXhxQbTQAGohAEGg0AAoAgAhAwJ/QQEgCEEDdnQiASAGcUUEQEGM0AAgASAGcjYCACAADAELIAAoAggLIgEgAzYCDCAAIAM2AgggAyAANgIMIAMgATYCCAsgAkEIaiEBQaDQACAENgIAQZTQACAFNgIADBELQZDQACgCACILRQ0BIAtoQQJ0QbzSAGooAgAiACgCBEF4cSAEayEFIAAhAgNAAkAgAigCECIBRQRAIAJBFGooAgAiAUUNAQsgASgCBEF4cSAEayIDIAVJIQIgAyAFIAIbIQUgASAAIAIbIQAgASECDAELCyAAKAIYIQkgACgCDCIDIABHBEBBnNAAKAIAGiADIAAoAggiATYCCCABIAM2AgwMEAsgAEEUaiICKAIAIgFFBEAgACgCECIBRQ0DIABBEGohAgsDQCACIQcgASIDQRRqIgIoAgAiAQ0AIANBEGohAiADKAIQIgENAAsgB0EANgIADA8LQX8hBCAAQb9/Sw0AIABBE2oiAUFwcSEEQZDQACgCACIIRQ0AQQAgBGshBQJAAkACQAJ/QQAgBEGAAkkNABpBHyAEQf///wdLDQAaIARBJiABQQh2ZyIAa3ZBAXEgAEEBdGtBPmoLIgZBAnRBvNIAaigCACICRQRAQQAhAUEAIQMMAQtBACEBIARBGSAGQQF2a0EAIAZBH0cbdCEAQQAhAwNAAkAgAigCBEF4cSAEayIHIAVPDQAgAiEDIAciBQ0AQQAhBSACIQEMAwsgASACQRRqKAIAIgcgByACIABBHXZBBHFqQRBqKAIAIgJGGyABIAcbIQEgAEEBdCEAIAINAAsLIAEgA3JFBEBBACEDQQIgBnQiAEEAIABrciAIcSIARQ0DIABoQQJ0QbzSAGooAgAhAQsgAUUNAQsDQCABKAIEQXhxIARrIgIgBUkhACACIAUgABshBSABIAMgABshAyABKAIQIgAEfyAABSABQRRqKAIACyIBDQALCyADRQ0AIAVBlNAAKAIAIARrTw0AIAMoAhghByADIAMoAgwiAEcEQEGc0AAoAgAaIAAgAygCCCIBNgIIIAEgADYCDAwOCyADQRRqIgIoAgAiAUUEQCADKAIQIgFFDQMgA0EQaiECCwNAIAIhBiABIgBBFGoiAigCACIBDQAgAEEQaiECIAAoAhAiAQ0ACyAGQQA2AgAMDQtBlNAAKAIAIgMgBE8EQEGg0AAoAgAhAQJAIAMgBGsiAkEQTwRAIAEgBGoiACACQQFyNgIEIAEgA2ogAjYCACABIARBA3I2AgQMAQsgASADQQNyNgIEIAEgA2oiACAAKAIEQQFyNgIEQQAhAEEAIQILQZTQACACNgIAQaDQACAANgIAIAFBCGohAQwPC0GY0AAoAgAiAyAESwRAIAQgCWoiACADIARrIgFBAXI2AgRBpNAAIAA2AgBBmNAAIAE2AgAgCSAEQQNyNgIEIAlBCGohAQwPC0EAIQEgBAJ/QeTTACgCAARAQezTACgCAAwBC0Hw0wBCfzcCAEHo0wBCgICEgICAwAA3AgBB5NMAIApBDGpBcHFB2KrVqgVzNgIAQfjTAEEANgIAQcjTAEEANgIAQYCABAsiACAEQccAaiIFaiIGQQAgAGsiB3EiAk8EQEH80wBBMDYCAAwPCwJAQcTTACgCACIBRQ0AQbzTACgCACIIIAJqIQAgACABTSAAIAhLcQ0AQQAhAUH80wBBMDYCAAwPC0HI0wAtAABBBHENBAJAAkAgCQRAQczTACEBA0AgASgCACIAIAlNBEAgACABKAIEaiAJSw0DCyABKAIIIgENAAsLQQAQMyIAQX9GDQUgAiEGQejTACgCACIBQQFrIgMgAHEEQCACIABrIAAgA2pBACABa3FqIQYLIAQgBk8NBSAGQf7///8HSw0FQcTTACgCACIDBEBBvNMAKAIAIgcgBmohASABIAdNDQYgASADSw0GCyAGEDMiASAARw0BDAcLIAYgA2sgB3EiBkH+////B0sNBCAGEDMhACAAIAEoAgAgASgCBGpGDQMgACEBCwJAIAYgBEHIAGpPDQAgAUF/Rg0AQezTACgCACIAIAUgBmtqQQAgAGtxIgBB/v///wdLBEAgASEADAcLIAAQM0F/RwRAIAAgBmohBiABIQAMBwtBACAGaxAzGgwECyABIgBBf0cNBQwDC0EAIQMMDAtBACEADAoLIABBf0cNAgtByNMAQcjTACgCAEEEcjYCAAsgAkH+////B0sNASACEDMhAEEAEDMhASAAQX9GDQEgAUF/Rg0BIAAgAU8NASABIABrIgYgBEE4ak0NAQtBvNMAQbzTACgCACAGaiIBNgIAQcDTACgCACABSQRAQcDTACABNgIACwJAAkACQEGk0AAoAgAiAgRAQczTACEBA0AgACABKAIAIgMgASgCBCIFakYNAiABKAIIIgENAAsMAgtBnNAAKAIAIgFBAEcgACABT3FFBEBBnNAAIAA2AgALQQAhAUHQ0wAgBjYCAEHM0wAgADYCAEGs0ABBfzYCAEGw0ABB5NMAKAIANgIAQdjTAEEANgIAA0AgAUHI0ABqIAFBvNAAaiICNgIAIAIgAUG00ABqIgM2AgAgAUHA0ABqIAM2AgAgAUHQ0ABqIAFBxNAAaiIDNgIAIAMgAjYCACABQdjQAGogAUHM0ABqIgI2AgAgAiADNgIAIAFB1NAAaiACNgIAIAFBIGoiAUGAAkcNAAtBeCAAa0EPcSIBIABqIgIgBkE4ayIDIAFrIgFBAXI2AgRBqNAAQfTTACgCADYCAEGY0AAgATYCAEGk0AAgAjYCACAAIANqQTg2AgQMAgsgACACTQ0AIAIgA0kNACABKAIMQQhxDQBBeCACa0EPcSIAIAJqIgNBmNAAKAIAIAZqIgcgAGsiAEEBcjYCBCABIAUgBmo2AgRBqNAAQfTTACgCADYCAEGY0AAgADYCAEGk0AAgAzYCACACIAdqQTg2AgQMAQsgAEGc0AAoAgBJBEBBnNAAIAA2AgALIAAgBmohA0HM0wAhAQJAAkACQANAIAMgASgCAEcEQCABKAIIIgENAQwCCwsgAS0ADEEIcUUNAQtBzNMAIQEDQCABKAIAIgMgAk0EQCADIAEoAgRqIgUgAksNAwsgASgCCCEBDAALAAsgASAANgIAIAEgASgCBCAGajYCBCAAQXggAGtBD3FqIgkgBEEDcjYCBCADQXggA2tBD3FqIgYgBCAJaiIEayEBIAIgBkYEQEGk0AAgBDYCAEGY0ABBmNAAKAIAIAFqIgA2AgAgBCAAQQFyNgIEDAgLQaDQACgCACAGRgRAQaDQACAENgIAQZTQAEGU0AAoAgAgAWoiADYCACAEIABBAXI2AgQgACAEaiAANgIADAgLIAYoAgQiBUEDcUEBRw0GIAVBeHEhCCAFQf8BTQRAIAVBA3YhAyAGKAIIIgAgBigCDCICRgRAQYzQAEGM0AAoAgBBfiADd3E2AgAMBwsgAiAANgIIIAAgAjYCDAwGCyAGKAIYIQcgBiAGKAIMIgBHBEAgACAGKAIIIgI2AgggAiAANgIMDAULIAZBFGoiAigCACIFRQRAIAYoAhAiBUUNBCAGQRBqIQILA0AgAiEDIAUiAEEUaiICKAIAIgUNACAAQRBqIQIgACgCECIFDQALIANBADYCAAwEC0F4IABrQQ9xIgEgAGoiByAGQThrIgMgAWsiAUEBcjYCBCAAIANqQTg2AgQgAiAFQTcgBWtBD3FqQT9rIgMgAyACQRBqSRsiA0EjNgIEQajQAEH00wAoAgA2AgBBmNAAIAE2AgBBpNAAIAc2AgAgA0EQakHU0wApAgA3AgAgA0HM0wApAgA3AghB1NMAIANBCGo2AgBB0NMAIAY2AgBBzNMAIAA2AgBB2NMAQQA2AgAgA0EkaiEBA0AgAUEHNgIAIAUgAUEEaiIBSw0ACyACIANGDQAgAyADKAIEQX5xNgIEIAMgAyACayIFNgIAIAIgBUEBcjYCBCAFQf8BTQRAIAVBeHFBtNAAaiEAAn9BjNAAKAIAIgFBASAFQQN2dCIDcUUEQEGM0AAgASADcjYCACAADAELIAAoAggLIgEgAjYCDCAAIAI2AgggAiAANgIMIAIgATYCCAwBC0EfIQEgBUH///8HTQRAIAVBJiAFQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAQsgAiABNgIcIAJCADcCECABQQJ0QbzSAGohAEGQ0AAoAgAiA0EBIAF0IgZxRQRAIAAgAjYCAEGQ0AAgAyAGcjYCACACIAA2AhggAiACNgIIIAIgAjYCDAwBCyAFQRkgAUEBdmtBACABQR9HG3QhASAAKAIAIQMCQANAIAMiACgCBEF4cSAFRg0BIAFBHXYhAyABQQF0IQEgACADQQRxakEQaiIGKAIAIgMNAAsgBiACNgIAIAIgADYCGCACIAI2AgwgAiACNgIIDAELIAAoAggiASACNgIMIAAgAjYCCCACQQA2AhggAiAANgIMIAIgATYCCAtBmNAAKAIAIgEgBE0NAEGk0AAoAgAiACAEaiICIAEgBGsiAUEBcjYCBEGY0AAgATYCAEGk0AAgAjYCACAAIARBA3I2AgQgAEEIaiEBDAgLQQAhAUH80wBBMDYCAAwHC0EAIQALIAdFDQACQCAGKAIcIgJBAnRBvNIAaiIDKAIAIAZGBEAgAyAANgIAIAANAUGQ0ABBkNAAKAIAQX4gAndxNgIADAILIAdBEEEUIAcoAhAgBkYbaiAANgIAIABFDQELIAAgBzYCGCAGKAIQIgIEQCAAIAI2AhAgAiAANgIYCyAGQRRqKAIAIgJFDQAgAEEUaiACNgIAIAIgADYCGAsgASAIaiEBIAYgCGoiBigCBCEFCyAGIAVBfnE2AgQgASAEaiABNgIAIAQgAUEBcjYCBCABQf8BTQRAIAFBeHFBtNAAaiEAAn9BjNAAKAIAIgJBASABQQN2dCIBcUUEQEGM0AAgASACcjYCACAADAELIAAoAggLIgEgBDYCDCAAIAQ2AgggBCAANgIMIAQgATYCCAwBC0EfIQUgAUH///8HTQRAIAFBJiABQQh2ZyIAa3ZBAXEgAEEBdGtBPmohBQsgBCAFNgIcIARCADcCECAFQQJ0QbzSAGohAEGQ0AAoAgAiAkEBIAV0IgNxRQRAIAAgBDYCAEGQ0AAgAiADcjYCACAEIAA2AhggBCAENgIIIAQgBDYCDAwBCyABQRkgBUEBdmtBACAFQR9HG3QhBSAAKAIAIQACQANAIAAiAigCBEF4cSABRg0BIAVBHXYhACAFQQF0IQUgAiAAQQRxakEQaiIDKAIAIgANAAsgAyAENgIAIAQgAjYCGCAEIAQ2AgwgBCAENgIIDAELIAIoAggiACAENgIMIAIgBDYCCCAEQQA2AhggBCACNgIMIAQgADYCCAsgCUEIaiEBDAILAkAgB0UNAAJAIAMoAhwiAUECdEG80gBqIgIoAgAgA0YEQCACIAA2AgAgAA0BQZDQACAIQX4gAXdxIgg2AgAMAgsgB0EQQRQgBygCECADRhtqIAA2AgAgAEUNAQsgACAHNgIYIAMoAhAiAQRAIAAgATYCECABIAA2AhgLIANBFGooAgAiAUUNACAAQRRqIAE2AgAgASAANgIYCwJAIAVBD00EQCADIAQgBWoiAEEDcjYCBCAAIANqIgAgACgCBEEBcjYCBAwBCyADIARqIgIgBUEBcjYCBCADIARBA3I2AgQgAiAFaiAFNgIAIAVB/wFNBEAgBUF4cUG00ABqIQACf0GM0AAoAgAiAUEBIAVBA3Z0IgVxRQRAQYzQACABIAVyNgIAIAAMAQsgACgCCAsiASACNgIMIAAgAjYCCCACIAA2AgwgAiABNgIIDAELQR8hASAFQf///wdNBEAgBUEmIAVBCHZnIgBrdkEBcSAAQQF0a0E+aiEBCyACIAE2AhwgAkIANwIQIAFBAnRBvNIAaiEAQQEgAXQiBCAIcUUEQCAAIAI2AgBBkNAAIAQgCHI2AgAgAiAANgIYIAIgAjYCCCACIAI2AgwMAQsgBUEZIAFBAXZrQQAgAUEfRxt0IQEgACgCACEEAkADQCAEIgAoAgRBeHEgBUYNASABQR12IQQgAUEBdCEBIAAgBEEEcWpBEGoiBigCACIEDQALIAYgAjYCACACIAA2AhggAiACNgIMIAIgAjYCCAwBCyAAKAIIIgEgAjYCDCAAIAI2AgggAkEANgIYIAIgADYCDCACIAE2AggLIANBCGohAQwBCwJAIAlFDQACQCAAKAIcIgFBAnRBvNIAaiICKAIAIABGBEAgAiADNgIAIAMNAUGQ0AAgC0F+IAF3cTYCAAwCCyAJQRBBFCAJKAIQIABGG2ogAzYCACADRQ0BCyADIAk2AhggACgCECIBBEAgAyABNgIQIAEgAzYCGAsgAEEUaigCACIBRQ0AIANBFGogATYCACABIAM2AhgLAkAgBUEPTQRAIAAgBCAFaiIBQQNyNgIEIAAgAWoiASABKAIEQQFyNgIEDAELIAAgBGoiByAFQQFyNgIEIAAgBEEDcjYCBCAFIAdqIAU2AgAgCARAIAhBeHFBtNAAaiEBQaDQACgCACEDAn9BASAIQQN2dCICIAZxRQRAQYzQACACIAZyNgIAIAEMAQsgASgCCAsiAiADNgIMIAEgAzYCCCADIAE2AgwgAyACNgIIC0Gg0AAgBzYCAEGU0AAgBTYCAAsgAEEIaiEBCyAKQRBqJAAgAQtDACAARQRAPwBBEHQPCwJAIABB//8DcQ0AIABBAEgNACAAQRB2QAAiAEF/RgRAQfzTAEEwNgIAQX8PCyAAQRB0DwsACwvcPyIAQYAICwkBAAAAAgAAAAMAQZQICwUEAAAABQBBpAgLCQYAAAAHAAAACABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJ
gitextract_9_mypmei/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── dependabot.yml
│ ├── e2e.yml
│ ├── nightly-e2e.yml
│ ├── ok-to-test.yml
│ ├── pr-e2e.yml
│ ├── pr.yml
│ └── release.yml
├── .gitignore
├── .npmrc
├── .prettierrc
├── LICENSE
├── README.md
├── action.yml
├── dist/
│ ├── index.js
│ └── package.json
├── e2e/
│ ├── Dockerfile
│ ├── multi.Dockerfile
│ └── test-build-dir/
│ └── Dockerfile
├── eslint.config.js
├── package.json
├── src/
│ ├── docker-build-push.js
│ ├── docker.js
│ ├── github.js
│ ├── main.js
│ └── utils.js
└── tests/
├── docker-build-push.test.js
├── docker.test.js
├── github.test.js
└── utils.test.js
SYMBOL INDEX (140 symbols across 3 files)
FILE: dist/index.js
method "node_modules/tunnel/lib/tunnel.js" (line 29) | "node_modules/tunnel/lib/tunnel.js"(exports2) {
method "node_modules/tunnel/index.js" (line 259) | "node_modules/tunnel/index.js"(exports2, module2) {
method "node_modules/undici/lib/core/symbols.js" (line 266) | "node_modules/undici/lib/core/symbols.js"(exports2, module2) {
method "node_modules/undici/lib/core/errors.js" (line 339) | "node_modules/undici/lib/core/errors.js"(exports2, module2) {
method "node_modules/undici/lib/core/constants.js" (line 697) | "node_modules/undici/lib/core/constants.js"(exports2, module2) {
method "node_modules/undici/lib/core/tree.js" (line 812) | "node_modules/undici/lib/core/tree.js"(exports2, module2) {
method "node_modules/undici/lib/core/util.js" (line 952) | "node_modules/undici/lib/core/util.js"(exports2, module2) {
method "node_modules/undici/lib/core/diagnostics.js" (line 1458) | "node_modules/undici/lib/core/diagnostics.js"(exports2, module2) {
method "node_modules/undici/lib/core/request.js" (line 1643) | "node_modules/undici/lib/core/request.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/dispatcher.js" (line 1976) | "node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/dispatcher-base.js" (line 2031) | "node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module...
method "node_modules/undici/lib/util/timers.js" (line 2192) | "node_modules/undici/lib/util/timers.js"(exports2, module2) {
method "node_modules/undici/lib/core/connect.js" (line 2423) | "node_modules/undici/lib/core/connect.js"(exports2, module2) {
method "node_modules/undici/lib/llhttp/utils.js" (line 2603) | "node_modules/undici/lib/llhttp/utils.js"(exports2) {
method "node_modules/undici/lib/llhttp/constants.js" (line 2623) | "node_modules/undici/lib/llhttp/constants.js"(exports2) {
method "node_modules/undici/lib/llhttp/llhttp-wasm.js" (line 2944) | "node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) {
method "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js" (line 2953) | "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/constants.js" (line 2962) | "node_modules/undici/lib/web/fetch/constants.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/global.js" (line 3180) | "node_modules/undici/lib/web/fetch/global.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/data-url.js" (line 3216) | "node_modules/undici/lib/web/fetch/data-url.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/webidl.js" (line 3568) | "node_modules/undici/lib/web/fetch/webidl.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/util.js" (line 3987) | "node_modules/undici/lib/web/fetch/util.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/symbols.js" (line 4857) | "node_modules/undici/lib/web/fetch/symbols.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/file.js" (line 4871) | "node_modules/undici/lib/web/fetch/file.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/formdata.js" (line 4934) | "node_modules/undici/lib/web/fetch/formdata.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/formdata-parser.js" (line 5081) | "node_modules/undici/lib/web/fetch/formdata-parser.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/body.js" (line 5332) | "node_modules/undici/lib/web/fetch/body.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/client-h1.js" (line 5646) | "node_modules/undici/lib/dispatcher/client-h1.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/client-h2.js" (line 6666) | "node_modules/undici/lib/dispatcher/client-h2.js"(exports2, module2) {
method "node_modules/undici/lib/handler/redirect-handler.js" (line 7207) | "node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) {
method "node_modules/undici/lib/interceptor/redirect-interceptor.js" (line 7366) | "node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports2, ...
method "node_modules/undici/lib/dispatcher/client.js" (line 7388) | "node_modules/undici/lib/dispatcher/client.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/fixed-queue.js" (line 7888) | "node_modules/undici/lib/dispatcher/fixed-queue.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/pool-stats.js" (line 7945) | "node_modules/undici/lib/dispatcher/pool-stats.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/pool-base.js" (line 7977) | "node_modules/undici/lib/dispatcher/pool-base.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/pool.js" (line 8132) | "node_modules/undici/lib/dispatcher/pool.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/balanced-pool.js" (line 8223) | "node_modules/undici/lib/dispatcher/balanced-pool.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/agent.js" (line 8367) | "node_modules/undici/lib/dispatcher/agent.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/proxy-agent.js" (line 8464) | "node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/env-http-proxy-agent.js" (line 8687) | "node_modules/undici/lib/dispatcher/env-http-proxy-agent.js"(exports2, m...
method "node_modules/undici/lib/handler/retry-handler.js" (line 8823) | "node_modules/undici/lib/handler/retry-handler.js"(exports2, module2) {
method "node_modules/undici/lib/dispatcher/retry-agent.js" (line 9121) | "node_modules/undici/lib/dispatcher/retry-agent.js"(exports2, module2) {
method "node_modules/undici/lib/api/readable.js" (line 9156) | "node_modules/undici/lib/api/readable.js"(exports2, module2) {
method "node_modules/undici/lib/api/util.js" (line 9449) | "node_modules/undici/lib/api/util.js"(exports2, module2) {
method "node_modules/undici/lib/api/api-request.js" (line 9510) | "node_modules/undici/lib/api/api-request.js"(exports2, module2) {
method "node_modules/undici/lib/api/abort-signal.js" (line 9696) | "node_modules/undici/lib/api/abort-signal.js"(exports2, module2) {
method "node_modules/undici/lib/api/api-stream.js" (line 9747) | "node_modules/undici/lib/api/api-stream.js"(exports2, module2) {
method "node_modules/undici/lib/api/api-pipeline.js" (line 9920) | "node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) {
method "node_modules/undici/lib/api/api-upgrade.js" (line 10120) | "node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) {
method "node_modules/undici/lib/api/api-connect.js" (line 10212) | "node_modules/undici/lib/api/api-connect.js"(exports2, module2) {
method "node_modules/undici/lib/api/index.js" (line 10302) | "node_modules/undici/lib/api/index.js"(exports2, module2) {
method "node_modules/undici/lib/mock/mock-errors.js" (line 10314) | "node_modules/undici/lib/mock/mock-errors.js"(exports2, module2) {
method "node_modules/undici/lib/mock/mock-symbols.js" (line 10339) | "node_modules/undici/lib/mock/mock-symbols.js"(exports2, module2) {
method "node_modules/undici/lib/mock/mock-utils.js" (line 10367) | "node_modules/undici/lib/mock/mock-utils.js"(exports2, module2) {
method "node_modules/undici/lib/mock/mock-interceptor.js" (line 10663) | "node_modules/undici/lib/mock/mock-interceptor.js"(exports2, module2) {
method "node_modules/undici/lib/mock/mock-client.js" (line 10825) | "node_modules/undici/lib/mock/mock-client.js"(exports2, module2) {
method "node_modules/undici/lib/mock/mock-pool.js" (line 10878) | "node_modules/undici/lib/mock/mock-pool.js"(exports2, module2) {
method "node_modules/undici/lib/mock/pluralizer.js" (line 10931) | "node_modules/undici/lib/mock/pluralizer.js"(exports2, module2) {
method "node_modules/undici/lib/mock/pending-interceptors-formatter.js" (line 10962) | "node_modules/undici/lib/mock/pending-interceptors-formatter.js"(exports...
method "node_modules/undici/lib/mock/mock-agent.js" (line 11003) | "node_modules/undici/lib/mock/mock-agent.js"(exports2, module2) {
method "node_modules/undici/lib/global.js" (line 11133) | "node_modules/undici/lib/global.js"(exports2, module2) {
method "node_modules/undici/lib/handler/decorator-handler.js" (line 11164) | "node_modules/undici/lib/handler/decorator-handler.js"(exports2, module2) {
method "node_modules/undici/lib/interceptor/redirect.js" (line 11204) | "node_modules/undici/lib/interceptor/redirect.js"(exports2, module2) {
method "node_modules/undici/lib/interceptor/retry.js" (line 11230) | "node_modules/undici/lib/interceptor/retry.js"(exports2, module2) {
method "node_modules/undici/lib/interceptor/dump.js" (line 11254) | "node_modules/undici/lib/interceptor/dump.js"(exports2, module2) {
method "node_modules/undici/lib/interceptor/dns.js" (line 11352) | "node_modules/undici/lib/interceptor/dns.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/headers.js" (line 11641) | "node_modules/undici/lib/web/fetch/headers.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/response.js" (line 12085) | "node_modules/undici/lib/web/fetch/response.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/dispatcher-weakref.js" (line 12484) | "node_modules/undici/lib/web/fetch/dispatcher-weakref.js"(exports2, modu...
method "node_modules/undici/lib/web/fetch/request.js" (line 12526) | "node_modules/undici/lib/web/fetch/request.js"(exports2, module2) {
method "node_modules/undici/lib/web/fetch/index.js" (line 13221) | "node_modules/undici/lib/web/fetch/index.js"(exports2, module2) {
method "node_modules/undici/lib/web/fileapi/symbols.js" (line 14288) | "node_modules/undici/lib/web/fileapi/symbols.js"(exports2, module2) {
method "node_modules/undici/lib/web/fileapi/progressevent.js" (line 14303) | "node_modules/undici/lib/web/fileapi/progressevent.js"(exports2, module2) {
method "node_modules/undici/lib/web/fileapi/encoding.js" (line 14371) | "node_modules/undici/lib/web/fileapi/encoding.js"(exports2, module2) {
method "node_modules/undici/lib/web/fileapi/util.js" (line 14657) | "node_modules/undici/lib/web/fileapi/util.js"(exports2, module2) {
method "node_modules/undici/lib/web/fileapi/filereader.js" (line 14842) | "node_modules/undici/lib/web/fileapi/filereader.js"(exports2, module2) {
method "node_modules/undici/lib/web/cache/symbols.js" (line 15101) | "node_modules/undici/lib/web/cache/symbols.js"(exports2, module2) {
method "node_modules/undici/lib/web/cache/util.js" (line 15111) | "node_modules/undici/lib/web/cache/util.js"(exports2, module2) {
method "node_modules/undici/lib/web/cache/cache.js" (line 15141) | "node_modules/undici/lib/web/cache/cache.js"(exports2, module2) {
method "node_modules/undici/lib/web/cache/cachestorage.js" (line 15686) | "node_modules/undici/lib/web/cache/cachestorage.js"(exports2, module2) {
method "node_modules/undici/lib/web/cookies/constants.js" (line 15796) | "node_modules/undici/lib/web/cookies/constants.js"(exports2, module2) {
method "node_modules/undici/lib/web/cookies/util.js" (line 15809) | "node_modules/undici/lib/web/cookies/util.js"(exports2, module2) {
method "node_modules/undici/lib/web/cookies/parse.js" (line 15979) | "node_modules/undici/lib/web/cookies/parse.js"(exports2, module2) {
method "node_modules/undici/lib/web/cookies/index.js" (line 16119) | "node_modules/undici/lib/web/cookies/index.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/events.js" (line 16248) | "node_modules/undici/lib/web/websocket/events.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/constants.js" (line 16514) | "node_modules/undici/lib/web/websocket/constants.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/symbols.js" (line 16571) | "node_modules/undici/lib/web/websocket/symbols.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/util.js" (line 16588) | "node_modules/undici/lib/web/websocket/util.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/frame.js" (line 16761) | "node_modules/undici/lib/web/websocket/frame.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/connection.js" (line 16838) | "node_modules/undici/lib/web/websocket/connection.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/permessage-deflate.js" (line 17023) | "node_modules/undici/lib/web/websocket/permessage-deflate.js"(exports2, ...
method "node_modules/undici/lib/web/websocket/receiver.js" (line 17116) | "node_modules/undici/lib/web/websocket/receiver.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/sender.js" (line 17425) | "node_modules/undici/lib/web/websocket/sender.js"(exports2, module2) {
method "node_modules/undici/lib/web/websocket/websocket.js" (line 17507) | "node_modules/undici/lib/web/websocket/websocket.js"(exports2, module2) {
method "node_modules/undici/lib/web/eventsource/util.js" (line 17891) | "node_modules/undici/lib/web/eventsource/util.js"(exports2, module2) {
method "node_modules/undici/lib/web/eventsource/eventsource-stream.js" (line 17918) | "node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports2...
method "node_modules/undici/lib/web/eventsource/eventsource.js" (line 18148) | "node_modules/undici/lib/web/eventsource/eventsource.js"(exports2, modul...
method "node_modules/undici/index.js" (line 18445) | "node_modules/undici/index.js"(exports2, module2) {
method "node_modules/dayjs/dayjs.min.js" (line 18587) | "node_modules/dayjs/dayjs.min.js"(exports2, module2) {
function toCommandValue (line 18869) | function toCommandValue(input) {
function toCommandProperties (line 18877) | function toCommandProperties(annotationProperties) {
function issueCommand (line 18892) | function issueCommand(command, properties, message) {
method constructor (line 18898) | constructor(command, properties, message) {
method toString (line 18906) | toString() {
function escapeData (line 18929) | function escapeData(s) {
function escapeProperty (line 18932) | function escapeProperty(s) {
function issueFileCommand (line 18940) | function issueFileCommand(command, message) {
function prepareKeyValueMessage (line 18952) | function prepareKeyValueMessage(key, value) {
function adopt (line 19026) | function adopt(value) {
function fulfilled (line 19032) | function fulfilled(value) {
function rejected (line 19039) | function rejected(value) {
function step (line 19046) | function step(result) {
method constructor (line 19055) | constructor() {
method filePath (line 19064) | filePath() {
method wrap (line 19091) | wrap(tag, content, attrs = {}) {
method write (line 19105) | write(options) {
method clear (line 19119) | clear() {
method stringify (line 19129) | stringify() {
method isEmptyBuffer (line 19137) | isEmptyBuffer() {
method emptyBuffer (line 19145) | emptyBuffer() {
method addRaw (line 19157) | addRaw(text, addEOL = false) {
method addEOL (line 19166) | addEOL() {
method addCodeBlock (line 19177) | addCodeBlock(code, lang) {
method addList (line 19190) | addList(items, ordered = false) {
method addTable (line 19203) | addTable(rows) {
method addDetails (line 19227) | addDetails(label, content) {
method addImage (line 19240) | addImage(src, alt, options) {
method addHeading (line 19254) | addHeading(text, level) {
method addSeparator (line 19265) | addSeparator() {
method addBreak (line 19274) | addBreak() {
method addQuote (line 19286) | addQuote(text, cite) {
method addLink (line 19299) | addLink(text, href) {
function getInput (line 19328) | function getInput(name, options) {
function setOutput (line 19338) | function setOutput(name, value) {
function setFailed (line 19346) | function setFailed(message) {
function error (line 19350) | function error(message, properties = {}) {
function warning (line 19353) | function warning(message, properties = {}) {
function info (line 19356) | function info(message) {
FILE: src/docker.js
constant GITHUB_REGISTRY_URLS (line 7) | const GITHUB_REGISTRY_URLS = ['docker.pkg.github.com', 'ghcr.io'];
FILE: tests/docker-build-push.test.js
constant GITHUB_REGISTRY_URLS (line 27) | const GITHUB_REGISTRY_URLS = ['docker.pkg.github.com', 'ghcr.io'];
Condensed preview — 31 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (934K chars).
[
{
"path": ".github/dependabot.yml",
"chars": 151,
"preview": "version: 2\nupdates:\n- package-ecosystem: npm\n directory: \"/\"\n schedule:\n interval: daily\n open-pull-requests-limit"
},
{
"path": ".github/workflows/ci.yml",
"chars": 968,
"preview": "name: 'Unit Tests'\n\non: [push]\n\npermissions:\n contents: read\n id-token: write\n\njobs:\n run-tests:\n if: ${{ github.a"
},
{
"path": ".github/workflows/dependabot.yml",
"chars": 1134,
"preview": "name: Dependabot\n\non:\n pull_request_target:\n types: [opened, synchronize, reopened]\n\npermissions:\n contents: write\n"
},
{
"path": ".github/workflows/e2e.yml",
"chars": 6639,
"preview": "name: 'e2e Tests'\n\non:\n workflow_call:\n inputs:\n pr-trigger:\n description: 'True if tests were triggered"
},
{
"path": ".github/workflows/nightly-e2e.yml",
"chars": 196,
"preview": "name: 'Nightly e2e Tests'\n\non:\n schedule:\n - cron: '0 8 * * *' # everyday at 8am UTC\n\njobs:\n e2e:\n uses: ./.gith"
},
{
"path": ".github/workflows/ok-to-test.yml",
"chars": 670,
"preview": "name: Ok To Test\n\non:\n workflow_dispatch:\n\njobs:\n ok-to-test:\n runs-on: ubuntu-latest\n if: false\n steps:\n "
},
{
"path": ".github/workflows/pr-e2e.yml",
"chars": 252,
"preview": "name: 'PR e2e Tests'\n\non:\n pull_request_target:\n types: [opened, synchronize, reopened]\n\njobs:\n e2e:\n uses: ./.g"
},
{
"path": ".github/workflows/pr.yml",
"chars": 650,
"preview": "name: 'Pull Request'\n\non: [pull_request]\n\njobs:\n run-tests:\n if: ${{ github.actor != 'dependabot[bot]' }}\n name: "
},
{
"path": ".github/workflows/release.yml",
"chars": 3800,
"preview": "name: 'Release'\n\non:\n push:\n tags:\n - 'v*'\n\njobs:\n release:\n name: Create Release\n runs-on: ubuntu-lates"
},
{
"path": ".gitignore",
"chars": 1042,
"preview": "# comment this out distribution branches\nnode_modules/\n\n# Editors\n.vscode\n.idea\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-d"
},
{
"path": ".npmrc",
"chars": 22,
"preview": "legacy-peer-deps=true\n"
},
{
"path": ".prettierrc",
"chars": 29,
"preview": "{\n \"arrowParens\": \"avoid\"\n}\n"
},
{
"path": "LICENSE",
"chars": 1067,
"preview": "MIT License\n\nCopyright (c) 2019 Sean Smith\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "README.md",
"chars": 19140,
"preview": "# Docker Build & Push Action\n\n[;\n\nconst isBranch = "
},
{
"path": "src/main.js",
"chars": 50,
"preview": "import run from './docker-build-push.js';\n\nrun();\n"
},
{
"path": "src/utils.js",
"chars": 721,
"preview": "import dayjs from 'dayjs';\n\nconst timestamp = () => dayjs().format('YYYY-MM-DD.HHMMss');\n\nconst parseArray = commaDelimi"
},
{
"path": "tests/docker-build-push.test.js",
"chars": 10987,
"preview": "import { jest } from '@jest/globals';\n\njest.unstable_mockModule('@actions/core', () => ({\n getInput: jest.fn(),\n setOu"
},
{
"path": "tests/docker.test.js",
"chars": 14569,
"preview": "import { jest } from '@jest/globals';\n\njest.unstable_mockModule('@actions/core', () => ({\n setFailed: jest.fn(),\n info"
},
{
"path": "tests/github.test.js",
"chars": 2071,
"preview": "import { jest } from '@jest/globals';\n\njest.unstable_mockModule('@actions/core', () => ({\n setFailed: jest.fn(),\n info"
},
{
"path": "tests/utils.test.js",
"chars": 2388,
"preview": "import { parseArray, asBool } from '../src/utils.js';\n\ndescribe('Parse a comma-delimited strings', () => {\n test('Parse"
}
]
About this extraction
This page contains the full source code of the mr-smithers-excellent/docker-build-push GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 31 files (880.2 KB), approximately 259.3k tokens, and a symbol index with 140 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.