From d6510076a74f7c5882afff4cb78a880e1120a072 Mon Sep 17 00:00:00 2001 From: Brian Ojeda <9335829+sgtoj@users.noreply.github.com> Date: Sun, 16 Jul 2023 23:33:25 +0000 Subject: [PATCH] feat: add initial project --- .devcontainer/devcontainer.json | 2 +- .devcontainer/tmp/.terraform.d/.gitkeep | 0 .github/workflows/release.yml | 14 + .github/workflows/test.yml | 27 + .gitignore | 3 + Makefile | 24 + README.md | 85 +- assets/cf-mw-auth/.dockerignore | 11 + assets/cf-mw-auth/.eslintrc.js | 46 + assets/cf-mw-auth/Dockerfile | 58 + assets/cf-mw-auth/jest.config.js | 18 + assets/cf-mw-auth/package-lock.json | 8307 +++++++++++++++++ assets/cf-mw-auth/package.json | 57 + assets/cf-mw-auth/scripts/README.md | 6 + assets/cf-mw-auth/scripts/gen-oauth-data.js | 67 + assets/cf-mw-auth/src/commons/config.test.ts | 128 + assets/cf-mw-auth/src/commons/config.ts | 145 + assets/cf-mw-auth/src/commons/errors.test.ts | 29 + assets/cf-mw-auth/src/commons/errors.ts | 25 + .../src/commons/fixtures/configuration.json | 44 + .../src/commons/jwt-verifier.test.ts | 105 + assets/cf-mw-auth/src/commons/jwt-verifier.ts | 80 + assets/cf-mw-auth/src/commons/logger.test.ts | 33 + assets/cf-mw-auth/src/commons/logger.ts | 65 + assets/cf-mw-auth/src/commons/types.ts | 55 + assets/cf-mw-auth/src/commons/utils.ts | 51 + .../cf-mw-auth/src/crypto/aws-crypter.test.ts | 95 + assets/cf-mw-auth/src/crypto/aws-crypter.ts | 63 + assets/cf-mw-auth/src/crypto/crypter.test.ts | 68 + assets/cf-mw-auth/src/crypto/crypter.ts | 46 + assets/cf-mw-auth/src/crypto/types.ts | 6 + assets/cf-mw-auth/src/fixtures/index.ts | 56 + assets/cf-mw-auth/src/index.ts | 55 + .../src/opa/fixtures/sample_policy.rego | 7 + .../src/opa/fixtures/sample_policy.wasm | Bin 0 -> 138998 bytes .../src/opa/fixtures/sample_policy_test.rego | 10 + assets/cf-mw-auth/src/opa/opa-policy.test.ts | 62 + assets/cf-mw-auth/src/opa/opa-policy.ts | 50 + .../src/services/bases/base-auth.test.ts | 193 + .../src/services/bases/base-auth.ts | 235 + .../src/services/check-auth.test.ts | 225 + assets/cf-mw-auth/src/services/check-auth.ts | 52 + .../services/fixtures/advanced_policy.rego | 24 + .../services/fixtures/advanced_policy.wasm | Bin 0 -> 334633 bytes .../fixtures/advanced_policy_test.rego | 179 + .../src/services/parse-auth.test.ts | 143 + assets/cf-mw-auth/src/services/parse-auth.ts | 100 + assets/cf-mw-auth/tsconfig.json | 42 + assets/cf-mw-urlrewrite/.dockerignore | 11 + assets/cf-mw-urlrewrite/.eslintrc.js | 35 + assets/cf-mw-urlrewrite/Dockerfile | 58 + assets/cf-mw-urlrewrite/jest.config.js | 18 + assets/cf-mw-urlrewrite/package-lock.json | 6793 ++++++++++++++ assets/cf-mw-urlrewrite/package.json | 49 + .../src/commons/config.test.ts | 72 + assets/cf-mw-urlrewrite/src/commons/config.ts | 72 + .../src/commons/errors.test.ts | 29 + assets/cf-mw-urlrewrite/src/commons/errors.ts | 25 + .../src/commons/fixtures/configuration.json | 4 + .../src/commons/logger.test.ts | 33 + assets/cf-mw-urlrewrite/src/commons/logger.ts | 63 + assets/cf-mw-urlrewrite/src/commons/types.ts | 26 + assets/cf-mw-urlrewrite/src/commons/utils.ts | 55 + .../src/opa/fixtures/sample_policy.rego | 7 + .../src/opa/fixtures/sample_policy.wasm | Bin 0 -> 138998 bytes .../src/opa/fixtures/sample_policy_test.rego | 10 + .../src/opa/opa-policy.test.ts | 62 + assets/cf-mw-urlrewrite/src/opa/opa-policy.ts | 50 + .../services/fixtures/advanced_policy.rego | 131 + .../services/fixtures/advanced_policy.wasm | Bin 0 -> 352171 bytes .../fixtures/advanced_policy_test.rego | 124 + .../src/services/fixtures/cf-req-events.ts | 186 + .../src/services/url-rewriter.test.ts | 135 + .../src/services/url-rewriter.ts | 74 + assets/cf-mw-urlrewrite/tsconfig.json | 42 + examples/complete/assets/index.html | 13 + examples/complete/main.tf | 245 + examples/complete/output.tf | 16 + examples/complete/variables.tf | 8 + examples/complete/version.tf | 6 +- main.tf | 306 + outputs.tf | 103 + variables.tf | 48 + 83 files changed, 20089 insertions(+), 16 deletions(-) create mode 100644 .devcontainer/tmp/.terraform.d/.gitkeep create mode 100644 .github/workflows/test.yml create mode 100644 Makefile create mode 100644 assets/cf-mw-auth/.dockerignore create mode 100644 assets/cf-mw-auth/.eslintrc.js create mode 100644 assets/cf-mw-auth/Dockerfile create mode 100644 assets/cf-mw-auth/jest.config.js create mode 100644 assets/cf-mw-auth/package-lock.json create mode 100644 assets/cf-mw-auth/package.json create mode 100644 assets/cf-mw-auth/scripts/README.md create mode 100755 assets/cf-mw-auth/scripts/gen-oauth-data.js create mode 100644 assets/cf-mw-auth/src/commons/config.test.ts create mode 100644 assets/cf-mw-auth/src/commons/config.ts create mode 100644 assets/cf-mw-auth/src/commons/errors.test.ts create mode 100644 assets/cf-mw-auth/src/commons/errors.ts create mode 100644 assets/cf-mw-auth/src/commons/fixtures/configuration.json create mode 100644 assets/cf-mw-auth/src/commons/jwt-verifier.test.ts create mode 100644 assets/cf-mw-auth/src/commons/jwt-verifier.ts create mode 100644 assets/cf-mw-auth/src/commons/logger.test.ts create mode 100644 assets/cf-mw-auth/src/commons/logger.ts create mode 100644 assets/cf-mw-auth/src/commons/types.ts create mode 100644 assets/cf-mw-auth/src/commons/utils.ts create mode 100644 assets/cf-mw-auth/src/crypto/aws-crypter.test.ts create mode 100644 assets/cf-mw-auth/src/crypto/aws-crypter.ts create mode 100644 assets/cf-mw-auth/src/crypto/crypter.test.ts create mode 100644 assets/cf-mw-auth/src/crypto/crypter.ts create mode 100644 assets/cf-mw-auth/src/crypto/types.ts create mode 100644 assets/cf-mw-auth/src/fixtures/index.ts create mode 100644 assets/cf-mw-auth/src/index.ts create mode 100644 assets/cf-mw-auth/src/opa/fixtures/sample_policy.rego create mode 100644 assets/cf-mw-auth/src/opa/fixtures/sample_policy.wasm create mode 100644 assets/cf-mw-auth/src/opa/fixtures/sample_policy_test.rego create mode 100644 assets/cf-mw-auth/src/opa/opa-policy.test.ts create mode 100644 assets/cf-mw-auth/src/opa/opa-policy.ts create mode 100644 assets/cf-mw-auth/src/services/bases/base-auth.test.ts create mode 100644 assets/cf-mw-auth/src/services/bases/base-auth.ts create mode 100644 assets/cf-mw-auth/src/services/check-auth.test.ts create mode 100644 assets/cf-mw-auth/src/services/check-auth.ts create mode 100644 assets/cf-mw-auth/src/services/fixtures/advanced_policy.rego create mode 100644 assets/cf-mw-auth/src/services/fixtures/advanced_policy.wasm create mode 100644 assets/cf-mw-auth/src/services/fixtures/advanced_policy_test.rego create mode 100644 assets/cf-mw-auth/src/services/parse-auth.test.ts create mode 100644 assets/cf-mw-auth/src/services/parse-auth.ts create mode 100644 assets/cf-mw-auth/tsconfig.json create mode 100644 assets/cf-mw-urlrewrite/.dockerignore create mode 100644 assets/cf-mw-urlrewrite/.eslintrc.js create mode 100644 assets/cf-mw-urlrewrite/Dockerfile create mode 100644 assets/cf-mw-urlrewrite/jest.config.js create mode 100644 assets/cf-mw-urlrewrite/package-lock.json create mode 100644 assets/cf-mw-urlrewrite/package.json create mode 100644 assets/cf-mw-urlrewrite/src/commons/config.test.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/config.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/errors.test.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/errors.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/fixtures/configuration.json create mode 100644 assets/cf-mw-urlrewrite/src/commons/logger.test.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/logger.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/types.ts create mode 100644 assets/cf-mw-urlrewrite/src/commons/utils.ts create mode 100644 assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.rego create mode 100644 assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.wasm create mode 100644 assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy_test.rego create mode 100644 assets/cf-mw-urlrewrite/src/opa/opa-policy.test.ts create mode 100644 assets/cf-mw-urlrewrite/src/opa/opa-policy.ts create mode 100644 assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.rego create mode 100644 assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.wasm create mode 100644 assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy_test.rego create mode 100644 assets/cf-mw-urlrewrite/src/services/fixtures/cf-req-events.ts create mode 100644 assets/cf-mw-urlrewrite/src/services/url-rewriter.test.ts create mode 100644 assets/cf-mw-urlrewrite/src/services/url-rewriter.ts create mode 100644 assets/cf-mw-urlrewrite/tsconfig.json create mode 100644 examples/complete/assets/index.html diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e62e666..eeb6c75 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,7 +5,7 @@ "ghcr.io/devcontainers/features/docker-in-docker:2.0.1": {}, }, "containerEnv": { - "TF_PLUGIN_CACHE_DIR": "/workspaces/terraform-aws-cloudfront-middleware-at-edge/.devcontainers/tmp/.terraform.d/" + "TF_PLUGIN_CACHE_DIR": "/workspaces/terraform-aws-cloudfront-middleware-at-edge/.devcontainer/tmp/.terraform.d/" }, "customizations": { "vscode": { diff --git a/.devcontainer/tmp/.terraform.d/.gitkeep b/.devcontainer/tmp/.terraform.d/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f3031f..879c67c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,20 @@ jobs: steps: - name: Checkout Code uses: actions/checkout@v3 + - name: Setup Node + uses: actions/setup-node@v3.7.0 + with: + node-version: 18 + - name: Tests for auth-at-edge + run: | + cd assets/cf-mw-auth + npm install + npm test + - name: Tests for url-rewriter + run: | + cd assets/cf-mw-urlrewrite + npm install + npm test - name: Bump Version id: tag_version uses: mathieudutour/github-tag-action@v6.1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..80ec60b --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,27 @@ +name: test + +on: + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v3 + - name: Setup Node + uses: actions/setup-node@v3.7.0 + with: + node-version: 18 + - name: Tests for auth-at-edge + run: | + cd assets/cf-mw-auth + npm install + npm test + - name: Tests for url-rewriter + run: | + cd assets/cf-mw-urlrewrite + npm install + npm test diff --git a/.gitignore b/.gitignore index fc0221b..59b7e01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,14 @@ # .gitignore # terraform files +.terraform.lock.hcl +.terraform.tfstate.lock.info *.tfstate *.tfstate.*.backup *.tfstate.backup *.tfplan *.terraform/ +*.tfvars .grunt # node.js / typescript diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..aa0fdaf --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +PROJ_ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +# allows args to pass to run-cmd example: make run-cmd echo "hello world" +ifeq (run-cmd,$(firstword $(MAKECMDGOALS))) + RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) + $(eval $(RUN_ARGS):;@:) +endif + +all: deps build + @exit 0 + +deps: + @exit 0 + +build: + @exit 0 + +clean: + @find . -type d -name "dist" -exec rm -rf {} + + @find . -type d -name ".terraform" -exec rm -rf {} + + @find . -type d -name ".terraform.d" -exec rm -rf {} + + @find . -type d -name ".tfstate" -exec rm -rf {} + + @find . -type d -name ".tfstate.backup" -exec rm -rf {} + + @touch .devcontainer/.terraform.d/.gitkeep || true diff --git a/README.md b/README.md index d17073b..cf65b7b 100755 --- a/README.md +++ b/README.md @@ -1,11 +1,16 @@ # Terraform Module: CloudFront Middleware-at-Edge -_This module is under active development and is not yet ready for use. Please -see `dev` branch for current progress._ +This Terraform module deploys customizable and reusable Lambda@Edge functions +that provide middleware for AWS CloudFront. ## Features -- TBA +- **Authentication & Authorization**: This feature provides authentication and + authorization to restrict access to a site hosted on CloudFront. Users can + optionally customize the authorization rules via an Open Policy Agent (OPA) + policy. +- **URL Rewriting**: This feature rewrites the URLs of requests. Users can + define URL rewrite rules via an Open Policy Agent (OPA) policy. ## Usage @@ -14,7 +19,29 @@ module "cloudfront_middleware_at_edge" { source = "sgtoj/cloudfront-middleware-at-edge/aws" version = "x.x.x" - # TBD + auth_service_config = { + enabled = true + cognito_idp_arn = "arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_TESTPOOL" + cognito_idp_domain = "test.auth.us-east-1.amazoncognito.com" + cognito_idp_client_id = "your-client-id" + cognito_idp_client_secret = "your-client-secret" + cognito_idp_client_scopes = ["openid", "email", "profile"] + + cognito_idp_jwks = { + keys = [ + { "alg": "RS256", "e": "AQAB", "kid": "...", "kty": "RSA", "n": "...", "use": "sig" }, + { "alg": "RS256", "e": "AQAB", "kid": "...", "kty": "RSA", "n": "...", "use": "sig" }, + ] + } + } + + urlrewrite_service_config = { + enabled = true + policy_content = <<-EOF + package urlrewriter + result := [] + EOF + } } ``` @@ -27,18 +54,50 @@ module "cloudfront_middleware_at_edge" { ## Inputs -_This module does not currently provide any input._ - -### Note - -This module uses the `cloudposse/label/null` module for naming and tagging -resources. As such, it also includes a `context.tf` file with additional -optional variables you can set. Refer to the [`cloudposse/label` documentation](https://registry.terraform.io/modules/cloudposse/label/null/latest) -for more details on these variables. +In addition to the variables documented below, this module includes several +other optional variables (e.g., `name`, `tags`, etc.) provided by the +`cloudposse/label/null` module. Please refer to the [`cloudposse/label` documentation](https://registry.terraform.io/modules/cloudposse/label/null/latest) for more details on these variables. + +| Name | Description | Type | Default | Required | +|---------------------------|---------------------------------------------------------------------------|:------:|:-------:|:--------:| +| auth_service_config | Configuration details for the authentication service. More details below. | object | `{}` | no | +| urlrewrite_service_config | Configuration details for the URL rewrite service, More details below. | object | `{}` | no | +| destruction_delay | Delay before destroying resources when they are deleted | string | `"20m"` | no | +| aws_account_id | The AWS account ID that the module will be deployed in | string | `""` | no | +| aws_region_name | The AWS region name where the module will be deployed | string | `""` | no | + +### `auth_service_config` + +| Property | Description | Type | Default | Required | +|---------------------------|------------------------------------------------|--------------------------------------|----------|----------| +| enabled | Enable the authentication service | bool | `true` | no | +| log_level | Logging level | string | `"info"` | no | +| aws_region | AWS region for the service | string | `null` | no | +| cognito_idp_arn | ARN of the Cognito Identity Provider | string | n/a | yes | +| cognito_idp_domain | Domain of the Cognito Identity Provider | string | n/a | yes | +| cognito_idp_jwks | JWKS of the Cognito Identity Provider | object({ keys = list(map(string)) }) | n/a | yes | +| cognito_idp_client_id | Client ID of the Cognito Identity Provider | string | n/a | yes | +| cognito_idp_client_secret | Client secret of the Cognito Identity Provider | string | n/a | yes | +| cognito_idp_client_scopes | Client scopes of the Cognito Identity Provider | list(string) | n/a | yes | +| opa_policy_content | Content of the OPA policy | string | `null` | no | +| opa_policy_data | Data for the OPA policy | map(string) | `{}` | no | + +### `urlrewrite_service_config` + +| Property | Description | Type | Default | Required | +|----------------|-----------------------------------|--------|---------------------------------------|----------| +| enabled | Enable the URL rewrite service | bool | `false` | no | +| log_level | Logging level | string | `"info"` | no | +| aws_region | AWS region for the service | string | `null` | no | +| policy_content | Content of the URL rewrite policy | string | `"package urlrewriter\nresult := []"` | no | ## Outputs -_This module does not currently provide any outputs._ +| Name | Description | +|---------------------|---------------------------------------------------------------------------| +| auth_services | Details of the created AWS Lambda functions for each of the auth services | +| auth_routes | Route configurations for the auth services | +| urlrewrite_services | Details of the created AWS Lambda function for the URL rewrite service | ## Contributing diff --git a/assets/cf-mw-auth/.dockerignore b/assets/cf-mw-auth/.dockerignore new file mode 100644 index 0000000..30fa193 --- /dev/null +++ b/assets/cf-mw-auth/.dockerignore @@ -0,0 +1,11 @@ +.gitignore +.git + +*Dockerfile* +*docker-compose* +.dockerignore + +.vscode/ +node_modules/ + +*.env diff --git a/assets/cf-mw-auth/.eslintrc.js b/assets/cf-mw-auth/.eslintrc.js new file mode 100644 index 0000000..aafe8b9 --- /dev/null +++ b/assets/cf-mw-auth/.eslintrc.js @@ -0,0 +1,46 @@ +module.exports = { + plugins: [ + 'import', + 'jest', + ], + rules: { + 'func-style': 'error', + }, + overrides: [ + { + files: [ + '**/*.{ts,tsx}', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2019, + sourceType: 'module', + tsconfigRootDir: __dirname, + project: [ + './tsconfig.json', + ], + }, + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'airbnb-typescript/base', + ], + rules: { + '@typescript-eslint/no-unused-vars': 'warn', + '@typescript-eslint/no-floating-promises': 'error', + }, + }, + { + files: [ + 'scripts/**/*.js', + ], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true + } + } + ], +}; diff --git a/assets/cf-mw-auth/Dockerfile b/assets/cf-mw-auth/Dockerfile new file mode 100644 index 0000000..1638923 --- /dev/null +++ b/assets/cf-mw-auth/Dockerfile @@ -0,0 +1,58 @@ +# ------------------------------------------------------------------- base --- + +FROM node:18 as base + +RUN mkdir -p /opt/app +WORKDIR /opt/app + +ENV NODE_ENV development + +# intentally not installing node_modules inside the /opt/app dir; this makes +# for a better experience when using image in development environment +ADD package*.json /opt/ +RUN npm ci + +ADD ./ ./ + +# -------------------------------------------------------------------- test --- + +FROM base as test + +RUN npm run lint && npm run test + +# -------------------------------------------------------------------- test --- + +FROM test as build + +ENV OPA_VERSION=0.49.0 +RUN SYSTEM_ARCH=$(dpkg --print-architecture) \ + && curl -L -o opa https://github.com/open-policy-agent/opa/releases/download/v${OPA_VERSION}/opa_linux_${SYSTEM_ARCH}_static \ + && mv opa /usr/bin/opa \ + && chmod +x /usr/bin/opa \ + && opa -h + +RUN npm run build + +ARG SERVICE_POLICY_ENCODED=cGFja2FnZSBhdXRoX2F0X2VkZ2VfYXV0aHoKcmVzdWx0cyA6PSBbXQo= +RUN echo "$SERVICE_POLICY_ENCODED" | base64 -d > /opt/app/dist/policy.rego + +RUN opa build -t wasm -e auth_at_edge_authz/results /opt/app/dist/policy.rego \ + && tar -zxv -C /opt/app/dist -f bundle.tar.gz '/policy.wasm' + +# ----------------------------------------------------------------- package --- + +FROM alpine:latest as package + +RUN apk add jq + +ARG SERVICE_CONFIG_ENCODED=e30K + +COPY --from=build /opt/app/dist /opt/app/dist +COPY --from=build /opt/package-lock.json /opt/app/dist/ + +RUN echo "$SERVICE_CONFIG_ENCODED" | base64 -d | jq > /opt/app/dist/configuration.json + +RUN apk add zip \ + && cd /opt/app/dist \ + && zip -r /tmp/package.zip . + diff --git a/assets/cf-mw-auth/jest.config.js b/assets/cf-mw-auth/jest.config.js new file mode 100644 index 0000000..eddee9a --- /dev/null +++ b/assets/cf-mw-auth/jest.config.js @@ -0,0 +1,18 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + verbose: true, + resetMocks: true, + testPathIgnorePatterns: [ + "dist" + ], + + moduleNameMapper: { + "#node-web-compat": "./node-web-compat-node.js", + }, +}; + +process.env = Object.assign(process.env, { + LOG_LEVEL: 'silent', +}); diff --git a/assets/cf-mw-auth/package-lock.json b/assets/cf-mw-auth/package-lock.json new file mode 100644 index 0000000..f2d6e15 --- /dev/null +++ b/assets/cf-mw-auth/package-lock.json @@ -0,0 +1,8307 @@ +{ + "name": "cf-mw-auth", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cf-mw-auth", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-kms": "^3.370.0", + "@open-policy-agent/opa-wasm": "^1.8.0", + "aws-jwt-verify": "^4.0.0", + "axios": "^1.4.0", + "cookie": "^0.5.0", + "pino": "^8.14.1" + }, + "devDependencies": { + "@jest/globals": "^29.6.1", + "@tsconfig/node18": "^18.2.0", + "@types/aws-lambda": "^8.10.119", + "@types/cookie": "^0.5.1", + "@types/jest": "^29.5.3", + "@types/node": "^18.16.19", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "aws-sdk-client-mock": "^3.0.0", + "aws-sdk-client-mock-jest": "^3.0.0", + "axios-mock-adapter": "^1.21.5", + "esbuild": "^0.18.13", + "eslint": "^8.45.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.3", + "jest": "^29.6.1", + "jest-mock-axios": "^4.7.2", + "jose": "^4.14.4", + "jsonwebtoken": "^9.0.1", + "node-jose": "^2.2.0", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-kms": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.370.0.tgz", + "integrity": "sha512-5nx9rzVrgdd0FC+SJm5iWX8oJo5AJOkDW/jjgWAM/+R4tWJy69ubhfyfMmUjQ97RjYKfDRqmAE/9aeOT+H6Vtg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.370.0", + "@aws-sdk/credential-provider-node": "3.370.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-signing": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.370.0.tgz", + "integrity": "sha512-0Ty1iHuzNxMQtN7nahgkZr4Wcu1XvqGfrQniiGdKKif9jG/4elxsQPiydRuQpFqN6b+bg7wPP7crFP1uTxx2KQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.370.0.tgz", + "integrity": "sha512-jAYOO74lmVXylQylqkPrjLzxvUnMKw476JCUTvCO6Q8nv3LzCWd76Ihgv/m9Q4M2Tbqi1iP2roVK5bstsXzEjA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.370.0.tgz", + "integrity": "sha512-utFxOPWIzbN+3kc415Je2o4J72hOLNhgR2Gt5EnRSggC3yOnkC4GzauxG8n7n5gZGBX45eyubHyPOXLOIyoqQA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.370.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-sdk-sts": "3.370.0", + "@aws-sdk/middleware-signing": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.370.0.tgz", + "integrity": "sha512-raR3yP/4GGbKFRPP5hUBNkEmTnzxI9mEc2vJAJrcv4G4J4i/UP6ELiLInQ5eO2/VcV/CeKGZA3t7d1tsJ+jhCg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.370.0.tgz", + "integrity": "sha512-eJyapFKa4NrC9RfTgxlXnXfS9InG/QMEUPPVL+VhG7YS6nKqetC1digOYgivnEeu+XSKE0DJ7uZuXujN2Y7VAQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.370.0", + "@aws-sdk/credential-provider-process": "3.370.0", + "@aws-sdk/credential-provider-sso": "3.370.0", + "@aws-sdk/credential-provider-web-identity": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/credential-provider-imds": "^1.0.1", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.370.0.tgz", + "integrity": "sha512-gkFiotBFKE4Fcn8CzQnMeab9TAR06FEAD02T4ZRYW1xGrBJOowmje9dKqdwQFHSPgnWAP+8HoTA8iwbhTLvjNA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.370.0", + "@aws-sdk/credential-provider-ini": "3.370.0", + "@aws-sdk/credential-provider-process": "3.370.0", + "@aws-sdk/credential-provider-sso": "3.370.0", + "@aws-sdk/credential-provider-web-identity": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/credential-provider-imds": "^1.0.1", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.370.0.tgz", + "integrity": "sha512-0BKFFZmUO779Xdw3u7wWnoWhYA4zygxJbgGVSyjkOGBvdkbPSTTcdwT1KFkaQy2kOXYeZPl+usVVRXs+ph4ejg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.370.0.tgz", + "integrity": "sha512-PFroYm5hcPSfC/jkZnCI34QFL3I7WVKveVk6/F3fud/cnP8hp6YjA9NiTNbqdFSzsyoiN/+e5fZgNKih8vVPTA==", + "dependencies": { + "@aws-sdk/client-sso": "3.370.0", + "@aws-sdk/token-providers": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.370.0.tgz", + "integrity": "sha512-CFaBMLRudwhjv1sDzybNV93IaT85IwS+L8Wq6VRMa0mro1q9rrWsIZO811eF+k0NEPfgU1dLH+8Vc2qhw4SARQ==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.370.0.tgz", + "integrity": "sha512-CPXOm/TnOFC7KyXcJglICC7OiA7Kj6mT3ChvEijr56TFOueNHvJdV4aNIFEQy0vGHOWtY12qOWLNto/wYR1BAQ==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.370.0.tgz", + "integrity": "sha512-cQMq9SaZ/ORmTJPCT6VzMML7OxFdQzNkhMAgKpTDl+tdPWynlHF29E5xGoSzROnThHlQPCjogU0NZ8AxI0SWPA==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.370.0.tgz", + "integrity": "sha512-L7ZF/w0lAAY/GK1khT8VdoU0XB7nWHk51rl/ecAg64J70dHnMOAg8n+5FZ9fBu/xH1FwUlHOkwlodJOgzLJjtg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.370.0.tgz", + "integrity": "sha512-ykbsoVy0AJtVbuhAlTAMcaz/tCE3pT8nAp0L7CQQxSoanRCvOux7au0KwMIQVhxgnYid4dWVF6d00SkqU5MXRA==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.370.0.tgz", + "integrity": "sha512-Dwr/RTCWOXdm394wCwICGT2VNOTMRe4IGPsBRJAsM24pm+EEqQzSS3Xu/U/zF4exuxqpMta4wec4QpSarPNTxA==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/protocol-http": "^1.1.0", + "@smithy/signature-v4": "^1.0.1", + "@smithy/types": "^1.1.0", + "@smithy/util-middleware": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.370.0.tgz", + "integrity": "sha512-2+3SB6MtMAq1+gVXhw0Y3ONXuljorh6ijnxgTpv+uQnBW5jHCUiAS8WDYiDEm7i9euJPbvJfM8WUrSMDMU6Cog==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.370.0.tgz", + "integrity": "sha512-EyR2ZYr+lJeRiZU2/eLR+mlYU9RXLQvNyGFSAekJKgN13Rpq/h0syzXVFLP/RSod/oZenh/fhVZ2HwlZxuGBtQ==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz", + "integrity": "sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ==", + "dependencies": { + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.370.0.tgz", + "integrity": "sha512-5ltVAnM79nRlywwzZN5i8Jp4tk245OCGkKwwXbnDU+gq7zT3CIOsct1wNZvmpfZEPGt/bv7/NyRcjP+7XNsX/g==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.370.0.tgz", + "integrity": "sha512-028LxYZMQ0DANKhW+AKFQslkScZUeYlPmSphrCIXgdIItRZh6ZJHGzE7J/jDsEntZOrZJsjI4z0zZ5W2idj04w==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.370.0.tgz", + "integrity": "sha512-33vxZUp8vxTT/DGYIR3PivQm07sSRGWI+4fCv63Rt7Q++fO24E0kQtmVAlikRY810I10poD6rwILVtITtFSzkg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.13.tgz", + "integrity": "sha512-KwqFhxRFMKZINHzCqf8eKxE0XqWlAVPRxwy6rc7CbVFxzUWB2sA/s3hbMZeemPdhN3fKBkqOaFhTbS8xJXYIWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.13.tgz", + "integrity": "sha512-j7NhycJUoUAG5kAzGf4fPWfd17N6SM3o1X6MlXVqfHvs2buFraCJzos9vbeWjLxOyBKHyPOnuCuipbhvbYtTAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.13.tgz", + "integrity": "sha512-M2eZkRxR6WnWfVELHmv6MUoHbOqnzoTVSIxgtsyhm/NsgmL+uTmag/VVzdXvmahak1I6sOb1K/2movco5ikDJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.13.tgz", + "integrity": "sha512-f5goG30YgR1GU+fxtaBRdSW3SBG9pZW834Mmhxa6terzcboz7P2R0k4lDxlkP7NYRIIdBbWp+VgwQbmMH4yV7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.13.tgz", + "integrity": "sha512-RIrxoKH5Eo+yE5BtaAIMZaiKutPhZjw+j0OCh8WdvKEKJQteacq0myZvBDLU+hOzQOZWJeDnuQ2xgSScKf1Ovw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.13.tgz", + "integrity": "sha512-AfRPhHWmj9jGyLgW/2FkYERKmYR+IjYxf2rtSLmhOrPGFh0KCETFzSjx/JX/HJnvIqHt/DRQD/KAaVsUKoI3Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.13.tgz", + "integrity": "sha512-pGzWWZJBInhIgdEwzn8VHUBang8UvFKsvjDkeJ2oyY5gZtAM6BaxK0QLCuZY+qoj/nx/lIaItH425rm/hloETA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.13.tgz", + "integrity": "sha512-4iMxLRMCxGyk7lEvkkvrxw4aJeC93YIIrfbBlUJ062kilUUnAiMb81eEkVvCVoh3ON283ans7+OQkuy1uHW+Hw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.13.tgz", + "integrity": "sha512-hCzZbVJEHV7QM77fHPv2qgBcWxgglGFGCxk6KfQx6PsVIdi1u09X7IvgE9QKqm38OpkzaAkPnnPqwRsltvLkIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.13.tgz", + "integrity": "sha512-I3OKGbynl3AAIO6onXNrup/ttToE6Rv2XYfFgLK/wnr2J+1g+7k4asLrE+n7VMhaqX+BUnyWkCu27rl+62Adug==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.13.tgz", + "integrity": "sha512-8pcKDApAsKc6WW51ZEVidSGwGbebYw2qKnO1VyD8xd6JN0RN6EUXfhXmDk9Vc4/U3Y4AoFTexQewQDJGsBXBpg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.13.tgz", + "integrity": "sha512-6GU+J1PLiVqWx8yoCK4Z0GnfKyCGIH5L2KQipxOtbNPBs+qNDcMJr9euxnyJ6FkRPyMwaSkjejzPSISD9hb+gg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.13.tgz", + "integrity": "sha512-pfn/OGZ8tyR8YCV7MlLl5hAit2cmS+j/ZZg9DdH0uxdCoJpV7+5DbuXrR+es4ayRVKIcfS9TTMCs60vqQDmh+w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.13.tgz", + "integrity": "sha512-aIbhU3LPg0lOSCfVeGHbmGYIqOtW6+yzO+Nfv57YblEK01oj0mFMtvDJlOaeAZ6z0FZ9D13oahi5aIl9JFphGg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.13.tgz", + "integrity": "sha512-Pct1QwF2sp+5LVi4Iu5Y+6JsGaV2Z2vm4O9Dd7XZ5tKYxEHjFtb140fiMcl5HM1iuv6xXO8O1Vrb1iJxHlv8UA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.13.tgz", + "integrity": "sha512-zTrIP0KzYP7O0+3ZnmzvUKgGtUvf4+piY8PIO3V8/GfmVd3ZyHJGz7Ht0np3P1wz+I8qJ4rjwJKqqEAbIEPngA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.13.tgz", + "integrity": "sha512-I6zs10TZeaHDYoGxENuksxE1sxqZpCp+agYeW039yqFwh3MgVvdmXL5NMveImOC6AtpLvE4xG5ujVic4NWFIDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.13.tgz", + "integrity": "sha512-W5C5nczhrt1y1xPG5bV+0M12p2vetOGlvs43LH8SopQ3z2AseIROu09VgRqydx5qFN7y9qCbpgHLx0kb0TcW7g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.13.tgz", + "integrity": "sha512-X/xzuw4Hzpo/yq3YsfBbIsipNgmsm8mE/QeWbdGdTTeZ77fjxI2K0KP3AlhZ6gU3zKTw1bKoZTuKLnqcJ537qw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.13.tgz", + "integrity": "sha512-4CGYdRQT/ILd+yLLE5i4VApMPfGE0RPc/wFQhlluDQCK09+b4JDbxzzjpgQqTPrdnP7r5KUtGVGZYclYiPuHrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.13.tgz", + "integrity": "sha512-D+wKZaRhQI+MUGMH+DbEr4owC2D7XnF+uyGiZk38QbgzLcofFqIOwFs7ELmIeU45CQgfHNy9Q+LKW3cE8g37Kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.13.tgz", + "integrity": "sha512-iVl6lehAfJS+VmpF3exKpNQ8b0eucf5VWfzR8S7xFve64NBNz2jPUgx1X93/kfnkfgP737O+i1k54SVQS7uVZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "dev": true, + "dependencies": { + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-policy-agent/opa-wasm": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@open-policy-agent/opa-wasm/-/opa-wasm-1.8.0.tgz", + "integrity": "sha512-IFXh52ndKH5iWsB5ysWpjDxLtA5nUCMgalV7gbzW9VfjyDvu7Iq3G3wz3cXYtK1VWa94EeYi8oIrTrzzg33szQ==", + "dependencies": { + "sprintf-js": "^1.1.2", + "yaml": "^1.10.2" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@smithy/abort-controller": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz", + "integrity": "sha512-tb2h0b+JvMee+eAxTmhnyqyNk51UXIK949HnE14lFeezKsVJTB30maan+CO2IMwnig2wVYQH84B5qk6ylmKCuA==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.2.tgz", + "integrity": "sha512-8Bk7CgnVKg1dn5TgnjwPz2ebhxeR7CjGs5yhVYH3S8x0q8yPZZVWwpRIglwXaf5AZBzJlNO1lh+lUhMf2e73zQ==", + "dependencies": { + "@smithy/types": "^1.1.1", + "@smithy/util-config-provider": "^1.0.2", + "@smithy/util-middleware": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.2.tgz", + "integrity": "sha512-fLjCya+JOu2gPJpCiwSUyoLvT8JdNJmOaTOkKYBZoGf7CzqR6lluSyI+eboZnl/V0xqcfcqBG4tgqCISmWS3/w==", + "dependencies": { + "@smithy/node-config-provider": "^1.0.2", + "@smithy/property-provider": "^1.0.2", + "@smithy/types": "^1.1.1", + "@smithy/url-parser": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.2.tgz", + "integrity": "sha512-eW/XPiLauR1VAgHKxhVvgvHzLROUgTtqat2lgljztbH8uIYWugv7Nz+SgCavB+hWRazv2iYgqrSy74GvxXq/rg==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^1.1.1", + "@smithy/util-hex-encoding": "^1.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.2.tgz", + "integrity": "sha512-kynyofLf62LvR8yYphPPdyHb8fWG3LepFinM/vWUTG2Q1pVpmPCM530ppagp3+q2p+7Ox0UvSqldbKqV/d1BpA==", + "dependencies": { + "@smithy/protocol-http": "^1.1.1", + "@smithy/querystring-builder": "^1.0.2", + "@smithy/types": "^1.1.1", + "@smithy/util-base64": "^1.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.2.tgz", + "integrity": "sha512-K6PKhcUNrJXtcesyzhIvNlU7drfIU7u+EMQuGmPw6RQDAg/ufUcfKHz4EcUhFAodUmN+rrejhRG9U6wxjeBOQA==", + "dependencies": { + "@smithy/types": "^1.1.1", + "@smithy/util-buffer-from": "^1.0.2", + "@smithy/util-utf8": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.2.tgz", + "integrity": "sha512-B1Y3Tsa6dfC+Vvb+BJMhTHOfFieeYzY9jWQSTR1vMwKkxsymD0OIAnEw8rD/RiDj/4E4RPGFdx9Mdgnyd6Bv5Q==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.2.tgz", + "integrity": "sha512-pkyBnsBRpe+c/6ASavqIMRBdRtZNJEVJOEzhpxZ9JoAXiZYbkfaSMRA/O1dUxGdJ653GHONunnZ4xMo/LJ7utQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.2.tgz", + "integrity": "sha512-pa1/SgGIrSmnEr2c9Apw7CdU4l/HW0fK3+LKFCPDYJrzM0JdYpqjQzgxi31P00eAkL0EFBccpus/p1n2GF9urw==", + "dependencies": { + "@smithy/protocol-http": "^1.1.1", + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.3.tgz", + "integrity": "sha512-GsWvTXMFjSgl617PCE2km//kIjjtvMRrR2GAuRDIS9sHiLwmkS46VWaVYy+XE7ubEsEtzZ5yK2e8TKDR6Qr5Lw==", + "dependencies": { + "@smithy/middleware-serde": "^1.0.2", + "@smithy/types": "^1.1.1", + "@smithy/url-parser": "^1.0.2", + "@smithy/util-middleware": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.4.tgz", + "integrity": "sha512-G7uRXGFL8c3F7APnoIMTtNAHH8vT4F2qVnAWGAZaervjupaUQuRRHYBLYubK0dWzOZz86BtAXKieJ5p+Ni2Xpg==", + "dependencies": { + "@smithy/protocol-http": "^1.1.1", + "@smithy/service-error-classification": "^1.0.3", + "@smithy/types": "^1.1.1", + "@smithy/util-middleware": "^1.0.2", + "@smithy/util-retry": "^1.0.4", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.2.tgz", + "integrity": "sha512-T4PcdMZF4xme6koUNfjmSZ1MLi7eoFeYCtodQNQpBNsS77TuJt1A6kt5kP/qxrTvfZHyFlj0AubACoaUqgzPeg==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.2.tgz", + "integrity": "sha512-H7/uAQEcmO+eDqweEFMJ5YrIpsBwmrXSP6HIIbtxKJSQpAcMGY7KrR2FZgZBi1FMnSUOh+rQrbOyj5HQmSeUBA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.2.tgz", + "integrity": "sha512-HU7afWpTToU0wL6KseGDR2zojeyjECQfr8LpjAIeHCYIW7r360ABFf4EaplaJRMVoC3hD9FeltgI3/NtShOqCg==", + "dependencies": { + "@smithy/property-provider": "^1.0.2", + "@smithy/shared-ini-file-loader": "^1.0.2", + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.3.tgz", + "integrity": "sha512-PcPUSzTbIb60VCJCiH0PU0E6bwIekttsIEf5Aoo/M0oTfiqsxHTn0Rcij6QoH6qJy6piGKXzLSegspXg5+Kq6g==", + "dependencies": { + "@smithy/abort-controller": "^1.0.2", + "@smithy/protocol-http": "^1.1.1", + "@smithy/querystring-builder": "^1.0.2", + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.2.tgz", + "integrity": "sha512-pXDPyzKX8opzt38B205kDgaxda6LHcTfPvTYQZnwP6BAPp1o9puiCPjeUtkKck7Z6IbpXCPUmUQnzkUzWTA42Q==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.1.tgz", + "integrity": "sha512-mFLFa2sSvlUxm55U7B4YCIsJJIMkA6lHxwwqOaBkral1qxFz97rGffP/mmd4JDuin1EnygiO5eNJGgudiUgmDQ==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.2.tgz", + "integrity": "sha512-6P/xANWrtJhMzTPUR87AbXwSBuz1SDHIfL44TFd/GT3hj6rA+IEv7rftEpPjayUiWRocaNnrCPLvmP31mobOyA==", + "dependencies": { + "@smithy/types": "^1.1.1", + "@smithy/util-uri-escape": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.2.tgz", + "integrity": "sha512-IWxwxjn+KHWRRRB+K2Ngl+plTwo2WSgc2w+DvLy0DQZJh9UGOpw40d6q97/63GBlXIt4TEt5NbcFrO30CKlrsA==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.3.tgz", + "integrity": "sha512-2eglIYqrtcUnuI71yweu7rSfCgt6kVvRVf0C72VUqrd0LrV1M0BM0eYN+nitp2CHPSdmMI96pi+dU9U/UqAMSA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.2.tgz", + "integrity": "sha512-bdQj95VN+lCXki+P3EsDyrkpeLn8xDYiOISBGnUG/AGPYJXN8dmp4EhRRR7XOoLoSs8anZHR4UcGEOzFv2jwGw==", + "dependencies": { + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.2.tgz", + "integrity": "sha512-rpKUhmCuPmpV5dloUkOb9w1oBnJatvKQEjIHGmkjRGZnC3437MTdzWej9TxkagcZ8NRRJavYnEUixzxM1amFig==", + "dependencies": { + "@smithy/eventstream-codec": "^1.0.2", + "@smithy/is-array-buffer": "^1.0.2", + "@smithy/types": "^1.1.1", + "@smithy/util-hex-encoding": "^1.0.2", + "@smithy/util-middleware": "^1.0.2", + "@smithy/util-uri-escape": "^1.0.2", + "@smithy/util-utf8": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.4.tgz", + "integrity": "sha512-gpo0Xl5Nyp9sgymEfpt7oa9P2q/GlM3VmQIdm+FeH0QEdYOQx3OtvwVmBYAMv2FIPWxkMZlsPYRTnEiBTK5TYg==", + "dependencies": { + "@smithy/middleware-stack": "^1.0.2", + "@smithy/types": "^1.1.1", + "@smithy/util-stream": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz", + "integrity": "sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.2.tgz", + "integrity": "sha512-0JRsDMQe53F6EHRWksdcavKDRjyqp8vrjakg8EcCUOa7PaFRRB1SO/xGZdzSlW1RSTWQDEksFMTCEcVEKmAoqA==", + "dependencies": { + "@smithy/querystring-parser": "^1.0.2", + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.2.tgz", + "integrity": "sha512-BCm15WILJ3SL93nusoxvJGMVfAMWHZhdeDZPtpAaskozuexd0eF6szdz4kbXaKp38bFCSenA6bkUHqaE3KK0dA==", + "dependencies": { + "@smithy/util-buffer-from": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.2.tgz", + "integrity": "sha512-Xh8L06H2anF5BHjSYTg8hx+Itcbf4SQZnVMl4PIkCOsKtneMJoGjPRLy17lEzfoh/GOaa0QxgCP6lRMQWzNl4w==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.2.tgz", + "integrity": "sha512-nXHbZsUtvZeyfL4Ceds9nmy2Uh2AhWXohG4vWHyjSdmT8cXZlJdmJgnH6SJKDjyUecbu+BpKeVvSrA4cWPSOPA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.2.tgz", + "integrity": "sha512-lHAYIyrBO9RANrPvccnPjU03MJnWZ66wWuC5GjWWQVfsmPwU6m00aakZkzHdUT6tGCkGacXSgArP5wgTgA+oCw==", + "dependencies": { + "@smithy/is-array-buffer": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.2.tgz", + "integrity": "sha512-HOdmDm+3HUbuYPBABLLHtn8ittuRyy+BSjKOA169H+EMc+IozipvXDydf+gKBRAxUa4dtKQkLraypwppzi+PRw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.2.tgz", + "integrity": "sha512-J1u2PO235zxY7dg0+ZqaG96tFg4ehJZ7isGK1pCBEA072qxNPwIpDzUVGnLJkHZvjWEGA8rxIauDtXfB0qxeAg==", + "dependencies": { + "@smithy/property-provider": "^1.0.2", + "@smithy/types": "^1.1.1", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.2.tgz", + "integrity": "sha512-9/BN63rlIsFStvI+AvljMh873Xw6bbI6b19b+PVYXyycQ2DDQImWcjnzRlHW7eP65CCUNGQ6otDLNdBQCgMXqg==", + "dependencies": { + "@smithy/config-resolver": "^1.0.2", + "@smithy/credential-provider-imds": "^1.0.2", + "@smithy/node-config-provider": "^1.0.2", + "@smithy/property-provider": "^1.0.2", + "@smithy/types": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.2.tgz", + "integrity": "sha512-Bxydb5rMJorMV6AuDDMOxro3BMDdIwtbQKHpwvQFASkmr52BnpDsWlxgpJi8Iq7nk1Bt4E40oE1Isy/7ubHGzg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.2.tgz", + "integrity": "sha512-vtXK7GOR2BoseCX8NCGe9SaiZrm9M2lm/RVexFGyPuafTtry9Vyv7hq/vw8ifd/G/pSJ+msByfJVb1642oQHKw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.4.tgz", + "integrity": "sha512-RnZPVFvRoqdj2EbroDo3OsnnQU8eQ4AlnZTOGusbYKybH3269CFdrZfZJloe60AQjX7di3J6t/79PjwCLO5Khw==", + "dependencies": { + "@smithy/service-error-classification": "^1.0.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.2.tgz", + "integrity": "sha512-qyN2M9QFMTz4UCHi6GnBfLOGYKxQZD01Ga6nzaXFFC51HP/QmArU72e4kY50Z/EtW8binPxspP2TAsGbwy9l3A==", + "dependencies": { + "@smithy/fetch-http-handler": "^1.0.2", + "@smithy/node-http-handler": "^1.0.3", + "@smithy/types": "^1.1.1", + "@smithy/util-base64": "^1.0.2", + "@smithy/util-buffer-from": "^1.0.2", + "@smithy/util-hex-encoding": "^1.0.2", + "@smithy/util-utf8": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.2.tgz", + "integrity": "sha512-k8C0BFNS9HpBMHSgUDnWb1JlCQcFG+PPlVBq9keP4Nfwv6a9Q0yAfASWqUCtzjuMj1hXeLhn/5ADP6JxnID1Pg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.2.tgz", + "integrity": "sha512-V4cyjKfJlARui0dMBfWJMQAmJzoW77i4N3EjkH/bwnE2Ngbl4tqD2Y0C/xzpzY/J1BdxeCKxAebVFk8aFCaSCw==", + "dependencies": { + "@smithy/util-buffer-from": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.0.tgz", + "integrity": "sha512-yhxwIlFVSVcMym3O31HoMnRXpoenmpIxcj4Yoes2DUpe+xCJnA7ECQP1Vw889V0jTt/2nzvpLQ/UuMYCd3JPIg==", + "dev": true + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.119", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.119.tgz", + "integrity": "sha512-Vqm22aZrCvCd6I5g1SvpW151jfqwTzEZ7XJ3yZ6xaZG31nUEOEyzzVImjRcsN8Wi/QyPxId/x8GTtgIbsy8kEw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cookie": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/sinon": { + "version": "10.0.15", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", + "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz", + "integrity": "sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.0", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/type-utils": "6.0.0", + "@typescript-eslint/utils": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz", + "integrity": "sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz", + "integrity": "sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz", + "integrity": "sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/utils": "6.0.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz", + "integrity": "sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz", + "integrity": "sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz", + "integrity": "sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "@types/json-schema": "^7.0.11", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", + "eslint-scope": "^5.1.1", + "semver": "^7.5.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz", + "integrity": "sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.0.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-jwt-verify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/aws-jwt-verify/-/aws-jwt-verify-4.0.0.tgz", + "integrity": "sha512-1kCv+Ub3jBaQ6HnIjfAXswjp7xD0LO4GxwbQZ/o9IoJpb8/ZBUhHu5GQ4k2O7jOVTS/KOz86uw4NV71V3s6V3g==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/aws-sdk-client-mock": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-3.0.0.tgz", + "integrity": "sha512-4mBiWhuLYLZe1+K/iB8eYy5SAZyW2se+Keyh5u9QouMt6/qJ5SRZhss68xvUX5g3ApzROJ06QPRziYHP6buuvQ==", + "dev": true, + "dependencies": { + "@types/sinon": "^10.0.10", + "sinon": "^14.0.2", + "tslib": "^2.1.0" + } + }, + "node_modules/aws-sdk-client-mock-jest": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-3.0.0.tgz", + "integrity": "sha512-oV1rBQZc4UumLbzZAhi8UAehUq+k75hkQYGLrVIP0iJj85Z9xw+EaSsmJke/KQ8Z3vng+Xv1xbounsxpvZpunQ==", + "dev": true, + "dependencies": { + "@types/jest": "^28.1.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "aws-sdk-client-mock": "3.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@types/jest": { + "version": "28.1.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", + "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", + "dev": true, + "dependencies": { + "expect": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-mock-adapter": { + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", + "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "node_modules/babel-jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.6.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.461", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz", + "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.13.tgz", + "integrity": "sha512-vhg/WR/Oiu4oUIkVhmfcc23G6/zWuEQKFS+yiosSHe4aN6+DQRXIfeloYGibIfVhkr4wyfuVsGNLr+sQU1rWWw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.13", + "@esbuild/android-arm64": "0.18.13", + "@esbuild/android-x64": "0.18.13", + "@esbuild/darwin-arm64": "0.18.13", + "@esbuild/darwin-x64": "0.18.13", + "@esbuild/freebsd-arm64": "0.18.13", + "@esbuild/freebsd-x64": "0.18.13", + "@esbuild/linux-arm": "0.18.13", + "@esbuild/linux-arm64": "0.18.13", + "@esbuild/linux-ia32": "0.18.13", + "@esbuild/linux-loong64": "0.18.13", + "@esbuild/linux-mips64el": "0.18.13", + "@esbuild/linux-ppc64": "0.18.13", + "@esbuild/linux-riscv64": "0.18.13", + "@esbuild/linux-s390x": "0.18.13", + "@esbuild/linux-x64": "0.18.13", + "@esbuild/netbsd-x64": "0.18.13", + "@esbuild/openbsd-x64": "0.18.13", + "@esbuild/sunos-x64": "0.18.13", + "@esbuild/win32-arm64": "0.18.13", + "@esbuild/win32-ia32": "0.18.13", + "@esbuild/win32-x64": "0.18.13" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", + "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-redact": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock-axios": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/jest-mock-axios/-/jest-mock-axios-4.7.2.tgz", + "integrity": "sha512-8xrkCuEsscOLSw4Noi40Pq5tQMlKg3tbDZ0XNkf3Mv0Yq+z6+qS2tToimNs/3RIsEzoPXHTf2+mcySaNaYXIyw==", + "dev": true, + "dependencies": { + "@jest/globals": "^29.5.0", + "jest": "~29.5.0", + "synchronous-promise": "^2.0.17" + } + }, + "node_modules/jest-mock-axios/node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.1", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-jose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", + "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", + "dev": true, + "dependencies": { + "base64url": "^3.0.1", + "buffer": "^6.0.3", + "es6-promise": "^4.2.8", + "lodash": "^4.17.21", + "long": "^5.2.0", + "node-forge": "^1.2.1", + "pako": "^2.0.4", + "process": "^0.11.10", + "uuid": "^9.0.0" + } + }, + "node_modules/node-jose/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", + "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", + "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synchronous-promise": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", + "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thread-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", + "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/assets/cf-mw-auth/package.json b/assets/cf-mw-auth/package.json new file mode 100644 index 0000000..f855750 --- /dev/null +++ b/assets/cf-mw-auth/package.json @@ -0,0 +1,57 @@ +{ + "name": "cf-mw-auth", + "version": "0.1.0", + "description": "cloudfront middleware for authentication at edge", + "main": "index.js", + "contributors": [ + { + "name": "Brian Ojeda", + "email": "9335829+sgtoj@users.noreply.github.com" + } + ], + "scripts": { + "build": "npx tsc --noEmit && npx esbuild ./src/index.ts --bundle --platform=node --target=node18 --loader:.html=text --external:aws-lambda --log-level=warning --sourcemap --outfile=dist/index.js --minify", + "opa-build": "npm run opa-build:advanced_policy && npm run opa-build:sample_policy", + "opa-build:advanced_policy": "opa build -t wasm -e auth_at_edge_authz/results ./src/services/fixtures/advanced_policy.rego && tar -zxv -C ./src/services/fixtures/ -f bundle.tar.gz '/policy.wasm' && mv ./src/services/fixtures/policy.wasm ./src/services/fixtures/advanced_policy.wasm", + "opa-build:sample_policy": "opa build -t wasm -e sample/validate ./src/opa/fixtures/sample_policy.rego && tar -zxv -C ./src/opa/fixtures/ -f bundle.tar.gz '/policy.wasm' && mv ./src/opa/fixtures/policy.wasm ./src/opa/fixtures/sample_policy.wasm", + "opa-test": "npm run opa-test:advanced_policy && npm run opa-test:sample_policy", + "opa-test:sample_policy": "opa test -v ./src/opa/fixtures/sample_policy.rego ./src/opa/fixtures/sample_policy_test.rego", + "opa-test:advanced_policy": "opa test -v ./src/services/fixtures/advanced_policy.rego ./src/services/fixtures/advanced_policy_test.rego", + "test": "jest --coverage --detectOpenHandles --forceExit", + "tsc": "npx tsc", + "lint": "npx eslint src/**/*.ts" + }, + "license": "ISC", + "dependencies": { + "@aws-sdk/client-kms": "^3.370.0", + "@open-policy-agent/opa-wasm": "^1.8.0", + "aws-jwt-verify": "^4.0.0", + "axios": "^1.4.0", + "cookie": "^0.5.0", + "pino": "^8.14.1" + }, + "devDependencies": { + "@jest/globals": "^29.6.1", + "@tsconfig/node18": "^18.2.0", + "@types/aws-lambda": "^8.10.119", + "@types/cookie": "^0.5.1", + "@types/jest": "^29.5.3", + "@types/node": "^18.16.19", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "aws-sdk-client-mock": "^3.0.0", + "aws-sdk-client-mock-jest": "^3.0.0", + "axios-mock-adapter": "^1.21.5", + "esbuild": "^0.18.13", + "eslint": "^8.45.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.3", + "jest": "^29.6.1", + "jest-mock-axios": "^4.7.2", + "node-jose": "^2.2.0", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6" + } +} diff --git a/assets/cf-mw-auth/scripts/README.md b/assets/cf-mw-auth/scripts/README.md new file mode 100644 index 0000000..234e462 --- /dev/null +++ b/assets/cf-mw-auth/scripts/README.md @@ -0,0 +1,6 @@ +# cf-mw-auth scripts + +- `gen-oauth-data.js` - Generates oauth jwks and tokens to be used for testing + of `cf-mw-auth` module. It is not intended to be used in production. This + script is rarely used and is not part of the `cf-mw-auth` service. It was used + to generate the jwks and tokens saved as fixtures in `cf-mw-auth` module. diff --git a/assets/cf-mw-auth/scripts/gen-oauth-data.js b/assets/cf-mw-auth/scripts/gen-oauth-data.js new file mode 100755 index 0000000..b5ea766 --- /dev/null +++ b/assets/cf-mw-auth/scripts/gen-oauth-data.js @@ -0,0 +1,67 @@ +#!/usr/bin/env node +const jose = require('node-jose'); + +NINITY_NINE_YEARS_IN_SECS = 60 * 60 * 24 * 365 * 99; + +(async () => { + try { + const keystore = jose.JWK.createKeyStore(); + const key = await keystore.generate('RSA', 2048, { + alg: 'RS256', + use: 'sig', + }); + const jwks = keystore.toJSON(); + + const accessTokenPayload = { + sub: '00000000-aaaa-bbbb-cccc-111111111111', + iss: 'https://cognito-idp.us-east-1.amazonaws.com/us-east-1_TESTPOOL', + version: 2, + client_id: 'fake_client_id', + origin_jti: '00000000-aaaa-bbbb-cccc-111111111111', + event_id: '00000000-aaaa-bbbb-cccc-111111111111', + token_use: 'access', + scope: 'phone openid email profile', + auth_time: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + NINITY_NINE_YEARS_IN_SECS, + iat: Math.floor(Date.now() / 1000), + jti: '00000000-aaaa-bbbb-cccc-111111111111', + username: '00000000-aaaa-bbbb-cccc-111111111111', + }; + + const accessToken = await jose.JWS.createSign({ format: 'compact', fields: { kid: key.kid } }, key) + .update(JSON.stringify(accessTokenPayload)) + .final(); + + const idTokenPayload = { + at_hash: 'at_hash', + sub: '1234567890', + iss: 'https://cognito-idp.us-east-1.amazonaws.com/us-east-1_TESTPOOL', + origin_jti: '00000000-aaaa-bbbb-cccc-111111111111', + aud: 'fake_client_id', + event_id: '00000000-aaaa-bbbb-cccc-111111111111', + token_use: 'id', + auth_time: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + NINITY_NINE_YEARS_IN_SECS, + iat: Math.floor(Date.now() / 1000), + jti: '00000000-aaaa-bbbb-cccc-111111111111', + email: "john.doe@example.com", + email_verified: true, + "cognito:username": "00000000-aaaa-bbbb-cccc-111111111111", + }; + + const idToken = await jose.JWS.createSign({ format: 'compact', fields: { kid: key.kid } }, key) + .update(JSON.stringify(idTokenPayload)) + .final(); + + const refreshToken = jose.util.base64url.encode(jose.util.randomBytes(32)); + + console.log(JSON.stringify({ + jwks: [jwks.keys.find(k => k.kid === key.kid)], + accessToken, + idToken, + refreshToken, + }, null, 2)); + } catch (err) { + console.error(err); + } +})(); diff --git a/assets/cf-mw-auth/src/commons/config.test.ts b/assets/cf-mw-auth/src/commons/config.test.ts new file mode 100644 index 0000000..161d221 --- /dev/null +++ b/assets/cf-mw-auth/src/commons/config.test.ts @@ -0,0 +1,128 @@ +import { AppAuthServiceConfig, AppConfig, AppConfigSource, AppConfigState, AppEnvironmentVariables } from './config'; +import { AppError, AppErrorName } from './errors'; + +describe('AppConfig class', () => { + let mockProcessEnv: AppEnvironmentVariables; + + let mockAppAuthServiceConfig: AppAuthServiceConfig; + + let mockUserPoolArn: string; + + beforeEach(() => { + mockProcessEnv = { + AWS_LAMBDA_FUNCTION_MEMORY_SIZE: '1024MB', + AWS_LAMBDA_FUNCTION_NAME: 'test', + AWS_REGION: 'local', + AWS_EXECUTION_ENV: 'nodejs16x', + AWS_LAMBDA_FUNCTION_VERSION: '', + LOG_LEVEL: 'debug', + }; + + mockUserPoolArn = 'arn:aws:cognito-idp:us-east-1:000000000000:userpool/us-east-1_TESTPOOL'; + + mockAppAuthServiceConfig = { + awsRegion: 'us-east-1', + logEnabled: true, + logLevel: 'silent', + cognitoIdpArn: 'arn:aws:cognito-idp:us-east-1:000000000000:userpool/us-east-1_TESTPOOL', + cognitoIdpId: 'us-east-1_TESTPOOL', + cognitoIdpDomain: 'test.auth.us-east-1.amazoncognito.com', + cognitoIdpJwks: { + keys: [ + { + alg: 'RS256', + e: 'AQAB', + kid: 'w_Kvd6aNXPiQVj7ELBlr_3M1g17941i1A7TM8kM8iWQ', + kty: 'RSA', + n: '5TWp7zqXouL6Sobv9HaFi3utY8NOHxeXbb4ToL--vJH5hK3kDoPtdq37Gc5O8eQlWBuBwbi7AjL-N0F1pvPQYM_bcCEaypheMj7BdD42yR-tlhacXPPMgYggRPW3ML1x4z8ge_pYBp-HccoljtWKP-tqe_XpJnhw3yxIm6oDvFMz9FZlnYvW2QESnujVNrR4pgzh1He3Ihv1uE3OmMoPrawsmUFo6o0_foqIF7cQL2ZJIc2T_fdwxG9aIpjY-KQ1lCSlFFVpfX1xTfDAnyAtZYDRPv5My4ku22Bm-xKwMj244VqizZeOyc4cDEe9BaywAtjSsMmgUyJlbHpeomT8-Q', + use: 'sig', + }, + { + alg: 'RS256', + e: 'AQAB', + kid: 'ZKgb1NV5jU1UpB49YdWyRAYQ9j7sqIDWDAT/Igv16do=', + kty: 'RSA', + n: '15iW8rGLu7CN0Jr0VWFdLo383p0SxQshC771JuQJObRNspE7QxhSE4-IK2jld0ZdNSuCr3T-cSAGlD57uLMNQYjK27lPyuzidLrlUoooyI4cScRwIuVjPinuATWmgqi1R3-yET1iFGssjeTqxJvW_GXcjSg_NgTpwOUqAZqH4LG-oJqPnAw0fYK4-0lb35MTqQmIJVogaI79PvjQ58FzbhG0EHEzO2L7eMlTBavMZlwbycSSHIqnrNd5qJ-JZaiBGN3HpncT1QfXRPnJyt8meJvWY4Nw_cpNmAHlGNX3S_vs5G7IQN81rT7l2xW_18AMECS9Y6haysHIk98IosIMGQ', + use: 'sig', + }, + ], + }, + cognitoIdpClientId: 'fake_client_id', + cognitoIdpClientSecret: 'abc123', + cognitoIdpClientScopes: [ + 'phone', + 'email', + 'profile', + 'openid', + ], + oidcStateEncryptionKey: '12345678901234567890123456789012', + opaPolicyEnabled: false, + opaPolicyData: {}, + redirectPathAuthRefresh: '/_edge/auth/refresh', + redirectPathAuthSignIn: '/_edge/auth/signin', + redirectPathAuthSignOut: '/', + urlSignOut: '/_edge/auth/signout', + }; + }); + + it('should completely load the configuration from disk', async () => { + const config = new AppConfig(); + + await config.update(AppConfigSource.FILE, `${__dirname}/fixtures/configuration.json`); + + expect(config.state).toStrictEqual(AppConfigState.READY); + expect(config.awsRegion).toStrictEqual(mockAppAuthServiceConfig.awsRegion); + expect(config.logEnabled).toStrictEqual(mockAppAuthServiceConfig.logEnabled); + expect(config.logLevel).toStrictEqual(mockAppAuthServiceConfig.logLevel); + expect(config.cognitoIdpDomain).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpDomain); + expect(config.cognitoIdpJwks).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpJwks); + expect(config.cognitoIdpClientId).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpClientId); + expect(config.cognitoIdpClientSecret).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpClientSecret); + expect(config.cognitoIdpClientScopes).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpClientScopes); + expect(config.redirectPathAuthRefresh).toStrictEqual(mockAppAuthServiceConfig.redirectPathAuthRefresh); + expect(config.redirectPathAuthSignIn).toStrictEqual(mockAppAuthServiceConfig.redirectPathAuthSignIn); + expect(config.redirectPathAuthSignOut).toStrictEqual(mockAppAuthServiceConfig.redirectPathAuthSignOut); + expect(config.oidcStateEncryptionKey).toStrictEqual(mockAppAuthServiceConfig.oidcStateEncryptionKey); + expect(config.opaPolicyEnabled).toStrictEqual(mockAppAuthServiceConfig.opaPolicyEnabled); + expect(config.opaPolicyData).toStrictEqual(mockAppAuthServiceConfig.opaPolicyData); + expect(config.urlSignOut).toStrictEqual(mockAppAuthServiceConfig.urlSignOut); + expect(config.cognitoIdpArn).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpArn); + expect(config.cognitoIdpId).toStrictEqual(mockAppAuthServiceConfig.cognitoIdpId); + }); + + it('should set the correct default values', async () => { + const config = new AppConfig(); + delete mockAppAuthServiceConfig.awsRegion; + delete mockAppAuthServiceConfig.logLevel; + let error: unknown; + + try { + await config.update(AppConfigSource.STATIC, mockAppAuthServiceConfig); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(config.state).toStrictEqual(AppConfigState.READY); + expect(config.awsRegion).toStrictEqual('us-east-1'); + expect(config.logLevel).toStrictEqual('info'); + }); + + it('should error if unknown config source type is used', async () => { + const config = new AppConfig(); + let error: unknown; + + try { + await config.update('foobar' as any, ''); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeInstanceOf(AppError); + expect((error as AppError).errorName).toStrictEqual(AppErrorName.INVALID_CONFIG); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/commons/config.ts b/assets/cf-mw-auth/src/commons/config.ts new file mode 100644 index 0000000..087a87f --- /dev/null +++ b/assets/cf-mw-auth/src/commons/config.ts @@ -0,0 +1,145 @@ +import { AppError, AppErrorName } from './errors'; +import { logger } from './logger'; +import { readFile } from './utils'; +import type { LoggerLevel } from './logger'; +import type { Jwks } from 'aws-jwt-verify/jwk'; + +export interface AppEnvironmentVariables extends NodeJS.ProcessEnv { + AWS_LAMBDA_FUNCTION_MEMORY_SIZE?: string, + AWS_LAMBDA_FUNCTION_NAME?: string, + AWS_REGION?: string, + AWS_EXECUTION_ENV?: string, + AWS_LAMBDA_FUNCTION_VERSION?: string, + LOG_LEVEL?: string, +} + +export interface AppAuthServiceConfig { + awsRegion?: string; + logEnabled?: boolean; + logLevel?: LoggerLevel; + cognitoIdpClientId: string; + cognitoIdpClientSecret: string; + cognitoIdpClientScopes: string[]; + cognitoIdpArn: string; + cognitoIdpId?: string; + cognitoIdpDomain: string; + cognitoIdpJwks: Jwks; + redirectPathAuthRefresh: string; + redirectPathAuthSignIn: string; + redirectPathAuthSignOut: string; + urlSignOut: string; + oidcStateEncryptionKey: string; + opaPolicyEnabled?: boolean; + opaPolicyData?: Record; +} + +export enum AppConfigSource { + FILE, + STATIC, +} + +export enum AppConfigState { + READY, + NOT_READY, +} + +export class AppConfig implements AppAuthServiceConfig { + private _configuration: AppAuthServiceConfig; + + private _state: AppConfigState = AppConfigState.NOT_READY; + + constructor() { + this._configuration = {} as AppAuthServiceConfig; + } + + public get state() { + return this._state; + } + + public get awsRegion() { + return this._configuration.awsRegion || process.env.AWS_REGION || 'us-east-1'; + } + + public get logEnabled() { + return this._configuration.logEnabled ?? true; + } + + public get logLevel() { + return this._configuration.logLevel ?? 'info'; + } + + public get cognitoIdpArn() { + return this._configuration.cognitoIdpArn; + } + + public get cognitoIdpId() { + return this.cognitoIdpArn.split('/')[1] as string; + } + + public get cognitoIdpDomain() { + return this._configuration.cognitoIdpDomain; + } + + public get cognitoIdpJwks() { + return this._configuration.cognitoIdpJwks; + } + + public get cognitoIdpClientId() { + return this._configuration.cognitoIdpClientId; + } + + public get cognitoIdpClientSecret() { + return this._configuration.cognitoIdpClientSecret; + } + + public get cognitoIdpClientScopes() { + return this._configuration.cognitoIdpClientScopes; + } + + public get oidcStateEncryptionKey() { + return this._configuration.oidcStateEncryptionKey; + } + + public get redirectPathAuthSignIn() { + return this._configuration.redirectPathAuthSignIn; + } + + public get redirectPathAuthSignOut() { + return this._configuration.redirectPathAuthSignOut; + } + + public get redirectPathAuthRefresh() { + return this._configuration.redirectPathAuthRefresh; + } + + public get opaPolicyEnabled() { + return this._configuration.opaPolicyEnabled ?? false; + } + + public get opaPolicyData() { + return this._configuration.opaPolicyData; + } + + public get urlSignOut() { + return this._configuration.urlSignOut; + } + + public readonly update = async (sourceType: AppConfigSource, source: string | AppAuthServiceConfig) => { + let configuration: AppAuthServiceConfig; + if (sourceType === AppConfigSource.FILE && typeof source === 'string') + configuration = JSON.parse((await readFile(source)).toString('utf8')); + else if (sourceType === AppConfigSource.STATIC && typeof source !== 'string') + configuration = source; + else + throw new AppError('unknown configuration source', AppErrorName.INVALID_CONFIG); + + this._configuration = configuration; + logger.configure(this._configuration); + + if (!this._configuration.oidcStateEncryptionKey) + throw new AppError('required config is missing or empty: oidcStateEncryptionKey', AppErrorName.INVALID_CONFIG); + + this._state = AppConfigState.READY; + logger.debug({ config: this._configuration }, 'app config updated'); + }; +} diff --git a/assets/cf-mw-auth/src/commons/errors.test.ts b/assets/cf-mw-auth/src/commons/errors.test.ts new file mode 100644 index 0000000..9c79761 --- /dev/null +++ b/assets/cf-mw-auth/src/commons/errors.test.ts @@ -0,0 +1,29 @@ +import { AppError, AppErrorName, AppInputError } from './errors'; + +describe('AppError class', () => { + beforeEach(() => { }); + + it('should be instance of AppError', async () => { + const error = new AppError('fake error', AppErrorName.UNKNOWN); + + expect(error).toBeInstanceOf(AppError); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); + +describe('AppInputError class', () => { + beforeEach(() => { }); + + it('should be instance of AppInputError', async () => { + const error = new AppInputError('fake error', AppErrorName.UNKNOWN); + + expect(error).toBeInstanceOf(AppInputError); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/commons/errors.ts b/assets/cf-mw-auth/src/commons/errors.ts new file mode 100644 index 0000000..c880d4b --- /dev/null +++ b/assets/cf-mw-auth/src/commons/errors.ts @@ -0,0 +1,25 @@ +export enum AppErrorName { + INVALID_CONFIG = 'INVALID_CONFIG', + INVALID_INPUT = 'INVALID_INPUT', + COGNITO_ERROR = 'COGNITO_ERROR', + UNKNOWN = 'UNKNOWN', +} + +export class AppError extends Error { + public readonly errorName: AppErrorName; + + public constructor(message: string, errorName: AppErrorName) { + super(message); + this.errorName = errorName; + + Object.setPrototypeOf(this, AppError.prototype); + } +} + +export class AppInputError extends AppError { + public constructor(message: string, errorName: AppErrorName) { + super(message, errorName); + + Object.setPrototypeOf(this, AppInputError.prototype); + } +} diff --git a/assets/cf-mw-auth/src/commons/fixtures/configuration.json b/assets/cf-mw-auth/src/commons/fixtures/configuration.json new file mode 100644 index 0000000..76a6c97 --- /dev/null +++ b/assets/cf-mw-auth/src/commons/fixtures/configuration.json @@ -0,0 +1,44 @@ +{ + "logLevel": "silent", + "awsRegion": "us-east-1", + "cognitoIdpArn": "arn:aws:cognito-idp:us-east-1:000000000000:userpool/us-east-1_TESTPOOL", + "cognitoIdpDomain": "test.auth.us-east-1.amazoncognito.com", + "cognitoIdpRequiredGroup": "", + "cognitoIdpId": "us-east-1_TESTPOOL", + "cognitoIdpJwks": { + "keys": [ + { + "alg": "RS256", + "e": "AQAB", + "kid": "w_Kvd6aNXPiQVj7ELBlr_3M1g17941i1A7TM8kM8iWQ", + "kty": "RSA", + "n": "5TWp7zqXouL6Sobv9HaFi3utY8NOHxeXbb4ToL--vJH5hK3kDoPtdq37Gc5O8eQlWBuBwbi7AjL-N0F1pvPQYM_bcCEaypheMj7BdD42yR-tlhacXPPMgYggRPW3ML1x4z8ge_pYBp-HccoljtWKP-tqe_XpJnhw3yxIm6oDvFMz9FZlnYvW2QESnujVNrR4pgzh1He3Ihv1uE3OmMoPrawsmUFo6o0_foqIF7cQL2ZJIc2T_fdwxG9aIpjY-KQ1lCSlFFVpfX1xTfDAnyAtZYDRPv5My4ku22Bm-xKwMj244VqizZeOyc4cDEe9BaywAtjSsMmgUyJlbHpeomT8-Q", + "use": "sig" + }, + { + "alg": "RS256", + "e": "AQAB", + "kid": "ZKgb1NV5jU1UpB49YdWyRAYQ9j7sqIDWDAT/Igv16do=", + "kty": "RSA", + "n": "15iW8rGLu7CN0Jr0VWFdLo383p0SxQshC771JuQJObRNspE7QxhSE4-IK2jld0ZdNSuCr3T-cSAGlD57uLMNQYjK27lPyuzidLrlUoooyI4cScRwIuVjPinuATWmgqi1R3-yET1iFGssjeTqxJvW_GXcjSg_NgTpwOUqAZqH4LG-oJqPnAw0fYK4-0lb35MTqQmIJVogaI79PvjQ58FzbhG0EHEzO2L7eMlTBavMZlwbycSSHIqnrNd5qJ-JZaiBGN3HpncT1QfXRPnJyt8meJvWY4Nw_cpNmAHlGNX3S_vs5G7IQN81rT7l2xW_18AMECS9Y6haysHIk98IosIMGQ", + "use": "sig" + } + ] + }, + "cognitoIdpClientId": "fake_client_id", + "cognitoIdpClientSecret": "abc123", + "cognitoIdpClientScopes": [ + "phone", + "email", + "profile", + "openid" + ], + "redirectPathAuthRefresh": "/_edge/auth/refresh", + "redirectPathAuthSignIn": "/_edge/auth/signin", + "redirectPathAuthSignOut": "/", + "urlSignOut": "/_edge/auth/signout", + "oidcStateEncryptionKey": "12345678901234567890123456789012", + "opaPolicyEnabled": false, + "opaPolicyData": {}, + "additionalCookies": {} +} diff --git a/assets/cf-mw-auth/src/commons/jwt-verifier.test.ts b/assets/cf-mw-auth/src/commons/jwt-verifier.test.ts new file mode 100644 index 0000000..8483496 --- /dev/null +++ b/assets/cf-mw-auth/src/commons/jwt-verifier.test.ts @@ -0,0 +1,105 @@ +import { AppAuthServiceConfig } from './config'; +import { AppError } from './errors'; +import { AppJwtDecoder } from './jwt-verifier'; + +describe('AppJwtVerifier class', () => { + let mockAppAuthServiceConfig: AppAuthServiceConfig; + + beforeEach(() => { + mockAppAuthServiceConfig = { + logLevel: 'info', + cognitoIdpArn: 'arn:aws:cognito-idp:us-east-1:000000000000:userpool/us-east-1_TESTPOOL', + cognitoIdpId: 'us-east-1_TESTPOOL', + cognitoIdpDomain: 'test.auth.us-east-1.amazoncognito.com', + cognitoIdpJwks: { + keys: [ + { + alg: 'RS256', + e: 'AQAB', + kid: 'ZKgb1NV5jU1UpB49YdWyRAYQ9j7sqIDWDAT/Igv16do=', + kty: 'RSA', + n: '15iW8rGLu7CN0Jr0VWFdLo383p0SxQshC771JuQJObRNspE7QxhSE4-IK2jld0ZdNSuCr3T-cSAGlD57uLMNQYjK27lPyuzidLrlUoooyI4cScRwIuVjPinuATWmgqi1R3-yET1iFGssjeTqxJvW_GXcjSg_NgTpwOUqAZqH4LG-oJqPnAw0fYK4-0lb35MTqQmIJVogaI79PvjQ58FzbhG0EHEzO2L7eMlTBavMZlwbycSSHIqnrNd5qJ-JZaiBGN3HpncT1QfXRPnJyt8meJvWY4Nw_cpNmAHlGNX3S_vs5G7IQN81rT7l2xW_18AMECS9Y6haysHIk98IosIMGQ', + use: 'sig', + }, + { + alg: 'RS256', + e: 'AQAB', + kid: 'NEFxN84zi+HrjY/kTgOP0nAx0wO4kRliIQfdMdaEPlo=', + kty: 'RSA', + n: 'p_nTcrxlc1PCGpovgKlptgOX36-6wPcAlClOvYs9LzHZKb9hL-wuCejcgSJgfPfR_hJNEJbloe1GmqK7xXP7QBZ7-nheAQe6vCIucJ9-uxk1Xry--K-QbmgpiQx3t8We_XWT8Ye-5svT2RshHG-Xi03ZCRLMFPSKuMI38zUS99TOVsG-Kfw1WKm-5x58yeu_IsffJNdUHlGOOdTeZCAjUIWnb22HREdJlaf8k7nl461qkcwarLICbZR7tA6vYnioSBP7i3AeAVH8NXR_OxivcgtYcHZp2spZl42kdlJffh_aVnpfScKMY1jeTEhrD-Mk0sGm5sY61BrueMTaP3qv7Q', + use: 'sig', + }, + ], + }, + cognitoIdpClientId: '5mutv98opfcqrkfgf8ub7nr327', + cognitoIdpClientSecret: '1uqvqt9ebcip62ao8o574kkmmarl0cgvlmpn4ef2j6dn1m8gvj70', + cognitoIdpClientScopes: [ + 'phone', + 'email', + 'profile', + 'openid', + ], + oidcStateEncryptionKey: '12345678901234567890123456789012', + redirectPathAuthRefresh: '/_edge/auth/refresh', + redirectPathAuthSignIn: '/_edge/auth/signin', + redirectPathAuthSignOut: '/', + urlSignOut: '/_edge/auth/signout', + }; + }); + + it('should verify token via dependency inversion', async () => { + const verifierClient = { + verify: jest.fn().mockResolvedValue({}), + cacheJwks: jest.fn(), + } as any; + + const verifierCntr = { + create: jest.fn().mockReturnValue(verifierClient), + } as any; + + const decoder = new AppJwtDecoder(mockAppAuthServiceConfig as any, verifierCntr); + await decoder.verify('', ''); + + expect(verifierClient.verify).toBeCalledTimes(2); + }); + + it('should decode token via dependency inversion', async () => { + const verifierClient = { + verify: jest.fn().mockResolvedValue({}), + cacheJwks: jest.fn(), + } as any; + const verifierCntr = { + create: jest.fn().mockReturnValue(verifierClient), + } as any; + + const decoder = new AppJwtDecoder(mockAppAuthServiceConfig as any, verifierCntr); + const decodedTokens = await decoder.decode('', ''); + + expect(verifierClient.verify).toBeCalledTimes(2); + expect(decodedTokens).toStrictEqual({ accessToken: {}, idToken: {} }); + }); + + it('should throw error if token is invalid', async () => { + const verifierClient = { + verify: jest.fn().mockRejectedValue(new Error('invalid token')), + cacheJwks: jest.fn(), + } as any; + const verifierCntr = { + create: jest.fn().mockReturnValue(verifierClient), + } as any; + let error: unknown; + + try { + const decoder = new AppJwtDecoder(mockAppAuthServiceConfig as any, verifierCntr); + await decoder.verify('', ''); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeInstanceOf(Error); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/commons/jwt-verifier.ts b/assets/cf-mw-auth/src/commons/jwt-verifier.ts new file mode 100644 index 0000000..4a95a4b --- /dev/null +++ b/assets/cf-mw-auth/src/commons/jwt-verifier.ts @@ -0,0 +1,80 @@ +import { CognitoJwtVerifier } from 'aws-jwt-verify'; +import { AppConfig } from './config'; +import type { CognitoJwtVerifierSingleUserPool } from 'aws-jwt-verify/cognito-verifier'; +import type { CognitoAccessTokenPayload, CognitoIdTokenPayload } from 'aws-jwt-verify/jwt-model'; + +interface AppJwtDecoderOpts { + userPoolId: string; + clientId: string; + tokenUse: 'id' | 'access'; +} + +interface AppJwtAccessDecoderOpts extends AppJwtDecoderOpts { + tokenUse: 'access'; +} + +interface AppJwtIdDecoderOpts extends AppJwtDecoderOpts { + tokenUse: 'id'; +} + +export interface AppJwtDecoderDecodedTokens { + accessToken: CognitoAccessTokenPayload; + idToken: CognitoIdTokenPayload; +} + +export interface IJwtDecoder { + decodeAccessToken(accessToken: string): Promise>; + decodeIdToken(idToken: string): Promise>; + decode(accessToken: string, idToken: string): Promise; + verify(accessToken: string, idToken: string): Promise; +} + +export class AppJwtDecoder { + private readonly _accessTokenDecoder: CognitoJwtVerifierSingleUserPool; + + private readonly _idTokenDecoder: CognitoJwtVerifierSingleUserPool; + + constructor(config: AppConfig, veriferCnstr?: typeof CognitoJwtVerifier) { + const Verifier = veriferCnstr || CognitoJwtVerifier; + + this._idTokenDecoder = Verifier.create({ + userPoolId: config.cognitoIdpId, + clientId: config.cognitoIdpClientId, + tokenUse: 'id', + }); + + this._accessTokenDecoder = Verifier.create({ + userPoolId: config.cognitoIdpId, + clientId: config.cognitoIdpClientId, + tokenUse: 'access', + scope: config.cognitoIdpClientScopes, + }); + + this._idTokenDecoder.cacheJwks(config.cognitoIdpJwks); + } + + public readonly verify = async (accessToken: string, idToken: string): Promise => { + await this.decode(accessToken, idToken); + }; + + public readonly decode = async (accessToken: string, idToken: string): Promise => { + const decodeTokens = await Promise.all([ + this.decodeAccessToken(accessToken), + this.decodeIdToken(idToken), + ]); + return { + accessToken: decodeTokens[0], + idToken: decodeTokens[1], + }; + }; + + public readonly decodeAccessToken = async (token: string) => { + return this._accessTokenDecoder.verify(token); + }; + + public readonly decodeIdToken = async (token: string) => { + return this._idTokenDecoder.verify(token); + }; +} + +export { CognitoJwtInvalidGroupError, JwtExpiredError } from 'aws-jwt-verify/error'; diff --git a/assets/cf-mw-auth/src/commons/logger.test.ts b/assets/cf-mw-auth/src/commons/logger.test.ts new file mode 100644 index 0000000..7407236 --- /dev/null +++ b/assets/cf-mw-auth/src/commons/logger.test.ts @@ -0,0 +1,33 @@ +import { AppLogger } from './logger'; + +describe('AppLogger class', () => { + beforeEach(() => { }); + + it('should proxy log fn commands to 3rd party logger', async () => { + const libLoggerClient = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + trace: jest.fn(), + debug: jest.fn(), + }; + const libLogger = jest.fn().mockReturnValue(libLoggerClient); + + const logger = new AppLogger(libLogger); + logger.debug('foobar'); + logger.error('foobar'); + logger.info('foobar'); + logger.trace('foobar'); + logger.warn('foobar'); + + expect(libLoggerClient.debug).toBeCalledTimes(1); + expect(libLoggerClient.error).toBeCalledTimes(1); + expect(libLoggerClient.info).toBeCalledTimes(1); + expect(libLoggerClient.trace).toBeCalledTimes(1); + expect(libLoggerClient.warn).toBeCalledTimes(1); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/commons/logger.ts b/assets/cf-mw-auth/src/commons/logger.ts new file mode 100644 index 0000000..2ec05ed --- /dev/null +++ b/assets/cf-mw-auth/src/commons/logger.ts @@ -0,0 +1,65 @@ +import { pino, Logger, LogFn } from 'pino'; + +export type LoggerLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent'; + +export type LoggerLib = (...args: any[]) => Logger; + +export type AppLoggerLogFn = LogFn; + +export interface AppLoggerConfig { + logLevel?: string, + [k: string]: any, +} + +export class AppLogger { + private _lib: LoggerLib; + + private _logger: Logger; + + constructor(lib?: LoggerLib) { + this._lib = lib || pino; + this._logger = this._lib(AppLogger._buildConfiguration()); + } + + public configure = (config?: AppLoggerConfig): void => { + const logConfig = AppLogger._buildConfiguration(config); + this._logger = this._lib(logConfig); + }; + + public debug: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.debug(arg, ...args); + }; + + public info: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.info(arg, ...args); + }; + + public error: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.error(arg, ...args); + }; + + public trace: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.trace(arg, ...args); + }; + + public warn: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.warn(arg, ...args); + }; + + private static _buildConfiguration = (config?: AppLoggerConfig) => { + return { + enabled: config?.logEnabled || true, + base: { + memorySize: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE, + region: process.env.AWS_REGION, + runtime: process.env.AWS_EXECUTION_ENV, + version: process.env.AWS_LAMBDA_FUNCTION_VERSION, + }, + name: process.env.AWS_LAMBDA_FUNCTION_NAME, + level: config?.logLevel || process.env.LOG_LEVEL || 'info', + useLevelLabels: true, + }; + }; +} + +export const logger = new AppLogger(); diff --git a/assets/cf-mw-auth/src/commons/types.ts b/assets/cf-mw-auth/src/commons/types.ts new file mode 100644 index 0000000..5d723de --- /dev/null +++ b/assets/cf-mw-auth/src/commons/types.ts @@ -0,0 +1,55 @@ +import { CloudFrontRequest, CloudFrontRequestHandler, CloudFrontRequestResult } from 'aws-lambda'; +import { Logger } from 'pino'; +import { IAuthOptions } from '../services/bases/base-auth'; + +export type AppLogger = Logger; + +export interface AppCookies extends Cookies { + userId: string, + userScopes: string, + userTokenId: string, + userTokenAccess: string, + userTokenRefresh: string, +} + +export interface AppRequestData { + host: string; + cookies: AppCookies; + querystring: Record; + path: string; +} + +export interface AppResponseData { + location?: string; + cookies?: string[] + body?: string; +} + +export interface AppResponseInput { + request: AppRequestData; + response?: AppResponseData; +} + +export interface AppRequestStateData { + redirectedFromUrl?: string | undefined; + pkceCodeVerifier?: string | undefined; + pkceCodeChallenge?: string | undefined; +} + +export interface ICloudFrontRequestServiceConstructor { + new(opts: IAuthOptions): ICloudFrontRequestService +} + +export interface ICloudFrontRequestService { + handle: (request: CloudFrontRequest) => Promise +} + +export type CloudFrontRequestHandlerInitializer = (serviceClass: ICloudFrontRequestServiceConstructor) => CloudFrontRequestHandler; + +export type Cookies = { + [key: string]: string | undefined +}; + +export interface HttpHeaders { + [key: string]: string; +} diff --git a/assets/cf-mw-auth/src/commons/utils.ts b/assets/cf-mw-auth/src/commons/utils.ts new file mode 100644 index 0000000..ab9237b --- /dev/null +++ b/assets/cf-mw-auth/src/commons/utils.ts @@ -0,0 +1,51 @@ +import { readFile as fsReadFile } from 'fs'; + +const B64_URLSAFE_MAP = { + decode: { + '-': '+', + _: '/', + '.': '=', + }, + encode: { + '+': '-', + '/': '_', + '=': '.', + }, +}; + +export const sleep = async (time: number): Promise => { + return new Promise((resolve) => setTimeout(resolve, time)); +}; + +export const readFile = async (path: string): Promise => { + return new Promise((resolve, reject) => { + fsReadFile(path, (err, data) => !err ? resolve(data) : reject(err)); + }); +}; + +export const encodeBase64 = (data: string | Buffer): string => { + return Buffer.from(data).toString('base64'); +}; + +export const decodeBase64 = (data: string, encoding?: BufferEncoding): string => { + return Buffer.from(data, 'base64').toString(encoding); +}; + +export const stringifyUrlSafeBase64 = (data: string, trimPadding?: boolean): string => { + data = trimPadding ? data.replace(/=/, '') : data; + // @ts-expect-error + return data.replace(/[+/=]/g, (m) => B64_URLSAFE_MAP.encode[m]); +}; + +export const parseUrlSafeBase64 = (data: string) => { + // @ts-expect-error + return data.replace(/[-_.]/g, (m) => B64_URLSAFE_MAP.decode[m]); +}; + +export const isBase64 = (data: string): boolean => { + return /^[A-Za-z0-9+/]*[=]{0,2}$/.test(data); +}; + +export const isUrlSafeBase64 = (data: string): boolean => { + return /^[A-Za-z0-9_-]*[.]{0,2}$/.test(data); +}; diff --git a/assets/cf-mw-auth/src/crypto/aws-crypter.test.ts b/assets/cf-mw-auth/src/crypto/aws-crypter.test.ts new file mode 100644 index 0000000..5a76665 --- /dev/null +++ b/assets/cf-mw-auth/src/crypto/aws-crypter.test.ts @@ -0,0 +1,95 @@ +import { DecryptCommand, DecryptCommandInput, DecryptCommandOutput, EncryptCommand, EncryptCommandInput, EncryptCommandOutput, KMSClient } from '@aws-sdk/client-kms'; +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; +import { AwsCrypter } from './aws-crypter'; +import { ICrypter } from './types'; +import { isBase64 } from '../commons/utils'; + +describe('AwsCrypter serivce', () => { + let mockKeyId = 'FAKE_KEY'; + + let mockKmsDecryptInput: DecryptCommandInput; + + let mockKmsDecryptOutput: DecryptCommandOutput; + + let mockKmsEncryptInput: EncryptCommandInput; + + let mockKmsEncryptOutput: EncryptCommandOutput; + + beforeEach(() => { + mockKmsDecryptInput = { + CiphertextBlob: Buffer.from('test', 'base64'), + EncryptionContext: {}, + KeyId: mockKeyId, + }; + + mockKmsDecryptOutput = { + $metadata: {}, + KeyId: mockKeyId, + Plaintext: Buffer.from('test'), + }; + + mockKmsEncryptInput = { + KeyId: mockKeyId, + Plaintext: Buffer.from('test'), + EncryptionContext: {}, + }; + + mockKmsEncryptOutput = { + $metadata: {}, + CiphertextBlob: Buffer.from('test'), + EncryptionAlgorithm: 'test', + KeyId: mockKeyId, + }; + }); + + it('should call kms encrypt command', async () => { + const mockKms = mockClient(KMSClient); + mockKms.on(EncryptCommand).resolves(mockKmsEncryptOutput); + const crypter = new AwsCrypter(mockKeyId, mockKms as any); + + const encrypted = await crypter.encrypt('test', {}); + + expect(mockKms).toHaveReceivedCommandTimes(EncryptCommand, 1); + expect(mockKms).toHaveReceivedCommandWith(EncryptCommand, mockKmsEncryptInput); + expect(encrypted).toBe('test'); + }); + + it('should call kms decrypt command', async () => { + const mockKms = mockClient(KMSClient); + mockKms.on(DecryptCommand).resolves(mockKmsDecryptOutput); + const crypter = new AwsCrypter(mockKeyId, mockKms as any); + + const encrypted = await crypter.decrypt('test', {}); + + expect(mockKms).toHaveReceivedCommandTimes(DecryptCommand, 1); + expect(mockKms).toHaveReceivedCommandWith(DecryptCommand, mockKmsDecryptInput); + expect(encrypted).toBe('test'); + }); + + it('should hash data', async () => { + const phrase = "Roses are red, violets are blue, I'm a cryptographer, and so am I"; + const crypter = new AwsCrypter(mockKeyId); + + const hash = crypter.hash(phrase); + + expect(hash).toBeDefined(); + expect(hash).toBe('kbwSPiqk6VFkP9gjbnMrY2tlyYXLL8BwcuSEx/ie/LY='); + }); + + it('should hash data in based64 encoding', async () => { + const crypter = new AwsCrypter(mockKeyId); + + const hash00 = crypter.hash('test00'); + const hash01 = crypter.hash('test00'); + const hash02 = crypter.hash('test00'); + + expect(isBase64(hash00)).toBeTruthy(); + expect(isBase64(hash01)).toBeTruthy(); + expect(isBase64(hash02)).toBeTruthy(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/crypto/aws-crypter.ts b/assets/cf-mw-auth/src/crypto/aws-crypter.ts new file mode 100644 index 0000000..3556bdd --- /dev/null +++ b/assets/cf-mw-auth/src/crypto/aws-crypter.ts @@ -0,0 +1,63 @@ +import { DecryptCommand, EncryptCommand, KMSClient } from '@aws-sdk/client-kms'; +import { createHash, randomInt } from 'crypto'; +import type { DecryptCommandInput, DecryptCommandOutput, EncryptCommandInput, EncryptCommandOutput } from '@aws-sdk/client-kms'; +import type { ICrypter } from './types'; + +export class AwsCrypter implements ICrypter { + private readonly _client: KMSClient; + + private readonly _keyId: string; + + private readonly _defaultEncryptionContext: Record; + + constructor(keyId: string, kmsClient?: KMSClient) { + this._keyId = keyId; + this._client = kmsClient || new KMSClient({}); + this._defaultEncryptionContext = { placeholder: 'default-context' }; + } + + public encrypt = async (data: string, context?: Record): Promise => { + context = context || this._defaultEncryptionContext; + const input: EncryptCommandInput = { + KeyId: this._keyId, + Plaintext: Buffer.from(data), + EncryptionContext: context, + }; + + const response = await this.__encrypt(input); + return response.CiphertextBlob?.toString(); + }; + + public decrypt = async (data: string, context?: Record): Promise => { + context = context || this._defaultEncryptionContext; + const input: DecryptCommandInput = { + KeyId: this._keyId, + CiphertextBlob: Buffer.from(data, 'base64'), + EncryptionContext: context, + }; + + const response = await this.__decrypt(input); + return response.Plaintext?.toString(); + }; + + public hash = (data: string): string => { + return createHash('sha256').update(data).digest('base64'); + }; + + public generate = (length?: number): string => { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'; + return [...new Array(length)] + .map(() => chars[randomInt(0, chars.length)]) + .join(''); + }; + + private __encrypt = async (input: EncryptCommandInput): Promise => { + const command: EncryptCommand = new EncryptCommand(input); + return this._client.send(command); + }; + + private __decrypt = async (input: DecryptCommandInput): Promise => { + const command: DecryptCommand = new DecryptCommand(input); + return this._client.send(command); + }; +} diff --git a/assets/cf-mw-auth/src/crypto/crypter.test.ts b/assets/cf-mw-auth/src/crypto/crypter.test.ts new file mode 100644 index 0000000..fc233a3 --- /dev/null +++ b/assets/cf-mw-auth/src/crypto/crypter.test.ts @@ -0,0 +1,68 @@ +import { Crypter } from './crypter'; +import { isBase64 } from '../commons/utils'; + +describe('Crypter serivce', () => { + beforeEach(() => { }); + + it('should encrypt data', async () => { + const key = '12345678901234567890123456789012'; + const iv = '1234567890123456'; + const crypter = new Crypter(key); + + const encrypted = await crypter.encrypt('test'); + + expect(encrypted).toBeDefined(); + expect(encrypted).toBe('hPQo3w=='); + expect(typeof encrypted).toBe('string'); + expect(isBase64(encrypted as string)).toBeTruthy(); + }); + + it('should encrypt data in base64 encoding', async () => { + const crypter = new Crypter(); + + const encrypted00 = await crypter.encrypt('test00'); + const encrypted01 = await crypter.encrypt('test01'); + const encrypted02 = await crypter.encrypt('test02'); + + expect(isBase64(encrypted00 as string)).toBeTruthy(); + expect(isBase64(encrypted01 as string)).toBeTruthy(); + expect(isBase64(encrypted02 as string)).toBeTruthy(); + }); + + it('should decrypt data', async () => { + const phrase = "Roses are red, violets are blue, I'm a cryptographer, and so am I"; + const crypter = new Crypter(); + + const encrypted = await crypter.encrypt(phrase); + const decrypted = await crypter.decrypt(encrypted as string); + + expect(decrypted).toBeDefined(); + expect(decrypted).toBe(phrase); + }); + + it('should hash data', async () => { + const phrase = "Roses are red, violets are blue, I'm a cryptographer, and so am I"; + const crypter = new Crypter(); + + const hash = crypter.hash(phrase); + + expect(hash).toBeDefined(); + expect(hash).toBe('kbwSPiqk6VFkP9gjbnMrY2tlyYXLL8BwcuSEx/ie/LY='); + }); + + it('should hash data in based64 encoding', async () => { + const crypter = new Crypter(); + + const hash00 = crypter.hash('test00'); + const hash01 = crypter.hash('test00'); + const hash02 = crypter.hash('test00'); + + expect(isBase64(hash00)).toBeTruthy(); + expect(isBase64(hash01)).toBeTruthy(); + expect(isBase64(hash02)).toBeTruthy(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/crypto/crypter.ts b/assets/cf-mw-auth/src/crypto/crypter.ts new file mode 100644 index 0000000..e4fa82d --- /dev/null +++ b/assets/cf-mw-auth/src/crypto/crypter.ts @@ -0,0 +1,46 @@ +import { createCipheriv, createDecipheriv, createHash, randomInt } from 'crypto'; +import type { ICrypter } from './types'; + +export class Crypter implements ICrypter { + private readonly _key: string; + + private readonly _ivLength: number = 16; + + private readonly _defaultIvContext: Record; + + constructor(key?: string) { + this._key = key || this.generate(32); + this._defaultIvContext = { placeholder: 'default-context' }; + } + + public encrypt = async (input: string, context?: Record): Promise => { + const iv = this.__generateIv(context || this._defaultIvContext); + const cipher = createCipheriv('aes-256-ctr', this._key, iv); + const encrypted = cipher.update(input, 'utf8', 'base64'); + const result = encrypted + cipher.final('base64'); + return result; + }; + + public decrypt = async (input: string, context?: Record): Promise => { + const iv = this.__generateIv(context || this._defaultIvContext); + const decipher = createDecipheriv('aes-256-ctr', this._key, iv); + const decrypted = decipher.update(input, 'base64', 'utf8'); + const result = decrypted + decipher.final('utf8'); + return result; + }; + + public hash = (data: string): string => { + return createHash('sha256').update(data, 'utf8').digest('base64'); + }; + + public generate = (length?: number): string => { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'; + return [...new Array(length)] + .map(() => chars[randomInt(0, chars.length)]) + .join(''); + }; + + private __generateIv = (context: Record): string => { + return this.hash(JSON.stringify(context)).split('', this._ivLength).join('').padEnd(this._ivLength, '0'); + }; +} diff --git a/assets/cf-mw-auth/src/crypto/types.ts b/assets/cf-mw-auth/src/crypto/types.ts new file mode 100644 index 0000000..488d7e1 --- /dev/null +++ b/assets/cf-mw-auth/src/crypto/types.ts @@ -0,0 +1,6 @@ +export interface ICrypter { + encrypt(data: string, context?: Record): Promise; + decrypt(data: string, context?: Record): Promise; + generate(length?: number): string; + hash(data: string): string; +} diff --git a/assets/cf-mw-auth/src/fixtures/index.ts b/assets/cf-mw-auth/src/fixtures/index.ts new file mode 100644 index 0000000..6dffcac --- /dev/null +++ b/assets/cf-mw-auth/src/fixtures/index.ts @@ -0,0 +1,56 @@ +import type { AppAuthServiceConfig } from '../commons/config'; + +export const mockUserId: string = '00000000-aaaa-bbbb-cccc-111111111111'; + +export const mockCookieTokens: { access: string, id: string, refresh: string } = Object.freeze({ + access: 'eyJraWQiOiJ3X0t2ZDZhTlhQaVFWajdFTEJscl8zTTFnMTc5NDFpMUE3VE04a004aVdRIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIwMDAwMDAwMC1hYWFhLWJiYmItY2NjYy0xMTExMTExMTExMTEiLCJpc3MiOiJodHRwczovL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL3VzLWVhc3QtMV9URVNUUE9PTCIsInZlcnNpb24iOjIsImNsaWVudF9pZCI6ImZha2VfY2xpZW50X2lkIiwib3JpZ2luX2p0aSI6IjAwMDAwMDAwLWFhYWEtYmJiYi1jY2NjLTExMTExMTExMTExMSIsImV2ZW50X2lkIjoiMDAwMDAwMDAtYWFhYS1iYmJiLWNjY2MtMTExMTExMTExMTExIiwidG9rZW5fdXNlIjoiYWNjZXNzIiwic2NvcGUiOiJwaG9uZSBvcGVuaWQgZW1haWwgcHJvZmlsZSIsImF1dGhfdGltZSI6MTY4OTQ2MTAwNiwiZXhwIjo0ODExNTI1MDA2LCJpYXQiOjE2ODk0NjEwMDYsImp0aSI6IjAwMDAwMDAwLWFhYWEtYmJiYi1jY2NjLTExMTExMTExMTExMSIsInVzZXJuYW1lIjoiMDAwMDAwMDAtYWFhYS1iYmJiLWNjY2MtMTExMTExMTExMTExIn0.2pxZqPYuWIVDEd1BgJN9SBFKob8k1l4LY9XypWR-XmtcjCQV31Yyz9iCpG4p0H51XlbO1akiazy7qtkTC5BSlK1Xnk0dA7UQDXuwfvF9S7HPYprWyLo2dtZJcMF7cYxCjUWbM450u2dKF2IWQ2vwfWL8BInwWDQK5BIPImcZZj8BTzWwyv48gk-UWZPjABwsQOFJo4fONt7PQUTr_T7tMEQrFKH_Xvz0WtvdhhSOLiU-aIrDxj7SAG6WTAAYgJCoqYzJtkTpLnA5PU7eai_uqFiNi2_Zhw1fGBQZW_Xi2nkplnYpIxg1IJNUYly0oL30d2c3GYBmclQ82ggD2sN3Qw', + id: 'eyJraWQiOiJ3X0t2ZDZhTlhQaVFWajdFTEJscl8zTTFnMTc5NDFpMUE3VE04a004aVdRIiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoiYXRfaGFzaCIsInN1YiI6IjEyMzQ1Njc4OTAiLCJpc3MiOiJodHRwczovL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL3VzLWVhc3QtMV9URVNUUE9PTCIsIm9yaWdpbl9qdGkiOiIwMDAwMDAwMC1hYWFhLWJiYmItY2NjYy0xMTExMTExMTExMTEiLCJhdWQiOiJmYWtlX2NsaWVudF9pZCIsImV2ZW50X2lkIjoiMDAwMDAwMDAtYWFhYS1iYmJiLWNjY2MtMTExMTExMTExMTExIiwidG9rZW5fdXNlIjoiaWQiLCJhdXRoX3RpbWUiOjE2ODk0NjEwMDYsImV4cCI6NDgxMTUyNTAwNiwiaWF0IjoxNjg5NDYxMDA2LCJqdGkiOiIwMDAwMDAwMC1hYWFhLWJiYmItY2NjYy0xMTExMTExMTExMTEiLCJlbWFpbCI6ImpvaG4uZG9lQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImNvZ25pdG86dXNlcm5hbWUiOiIwMDAwMDAwMC1hYWFhLWJiYmItY2NjYy0xMTExMTExMTExMTEifQ.vdLE8u6L9SGCzFHnQ2Rpm0Epix7zd-AZgcAMInJFOfNDzNDT--7ng8PRCh0CujpyFAct8caUwF2EoqMAaFTaf7miTMTnaxLhFMnYjHnXAJ0WeUtel9iWUpBF-iWf3h4RiZnIts0Uti3u5QJQ3JALOjEVDsGG6x80iRbyi46EDtx-KXHVl58mYtpGClHcOW2pEQ4ewmSrVTapRMoQSXH5u6xQo9iZnEEEFkBMNFbxvStLrHvYOhzsN0YXOwOT6Dbrmw6GCZbyIGL-J1WVxmNEk9s8aOWE3zTCdMYS1-R7h5-Oqm0u7RBVRjz0ZemXFZvER3BB5MHS5JXjhYXnMWDBCw', + refresh: 'YF-_GjsKmVnFc-J0pi8ZBRO9TdtzycJlAKmk62kbtNU', +}); + +export const mockAppAuthServiceConfig: AppAuthServiceConfig = Object.freeze({ + logEnabled: false, + logLevel: 'error', + cognitoIdpArn: 'arn:aws:cognito-idp:us-east-1:000000000000:userpool/us-east-1_TESTPOOL', + cognitoIdpId: 'us-east-1_TESTPOOL', + cognitoIdpDomain: 'test.auth.us-east-1.amazoncognito.com', + cognitoIdpJwks: { + keys: [ + { + alg: 'RS256', + e: 'AQAB', + kid: 'w_Kvd6aNXPiQVj7ELBlr_3M1g17941i1A7TM8kM8iWQ', + kty: 'RSA', + n: '5TWp7zqXouL6Sobv9HaFi3utY8NOHxeXbb4ToL--vJH5hK3kDoPtdq37Gc5O8eQlWBuBwbi7AjL-N0F1pvPQYM_bcCEaypheMj7BdD42yR-tlhacXPPMgYggRPW3ML1x4z8ge_pYBp-HccoljtWKP-tqe_XpJnhw3yxIm6oDvFMz9FZlnYvW2QESnujVNrR4pgzh1He3Ihv1uE3OmMoPrawsmUFo6o0_foqIF7cQL2ZJIc2T_fdwxG9aIpjY-KQ1lCSlFFVpfX1xTfDAnyAtZYDRPv5My4ku22Bm-xKwMj244VqizZeOyc4cDEe9BaywAtjSsMmgUyJlbHpeomT8-Q', + use: 'sig', + }, + { + alg: 'RS256', + e: 'AQAB', + kid: 'ZKgb1NV5jU1UpB49YdWyRAYQ9j7sqIDWDAT/Igv16do=', + kty: 'RSA', + n: '15iW8rGLu7CN0Jr0VWFdLo383p0SxQshC771JuQJObRNspE7QxhSE4-IK2jld0ZdNSuCr3T-cSAGlD57uLMNQYjK27lPyuzidLrlUoooyI4cScRwIuVjPinuATWmgqi1R3-yET1iFGssjeTqxJvW_GXcjSg_NgTpwOUqAZqH4LG-oJqPnAw0fYK4-0lb35MTqQmIJVogaI79PvjQ58FzbhG0EHEzO2L7eMlTBavMZlwbycSSHIqnrNd5qJ-JZaiBGN3HpncT1QfXRPnJyt8meJvWY4Nw_cpNmAHlGNX3S_vs5G7IQN81rT7l2xW_18AMECS9Y6haysHIk98IosIMGQ', + use: 'sig', + }, + ], + }, + cognitoIdpClientId: '5mutv98opfcqrkfgf8ub7nr327', + cognitoIdpClientSecret: '1uqvqt9ebcip62ao8o574kkmmarl0cgvlmpn4ef2j6dn1m8gvj70', + cognitoIdpClientScopes: [ + 'phone', + 'email', + 'profile', + 'openid', + ], + oidcStateEncryptionKey: '12345678901234567890123456789012', + redirectPathAuthRefresh: '/_edge/auth/refresh', + redirectPathAuthSignIn: '/_edge/auth/signin', + redirectPathAuthSignOut: '/', + urlSignOut: '/_edge/auth/signout', +}); + +export const fixtures = { + mockAppAuthServiceConfig, + mockCookieTokens, + mockUserId, +}; diff --git a/assets/cf-mw-auth/src/index.ts b/assets/cf-mw-auth/src/index.ts new file mode 100644 index 0000000..466cd15 --- /dev/null +++ b/assets/cf-mw-auth/src/index.ts @@ -0,0 +1,55 @@ +import { AppConfig, AppConfigSource, AppConfigState } from './commons/config'; +import { AppError } from './commons/errors'; +import { AppJwtDecoder } from './commons/jwt-verifier'; +import { logger } from './commons/logger'; +import { Crypter } from './crypto/crypter'; +import { CheckAuthService } from './services/check-auth'; +import { ParseAuthService } from './services/parse-auth'; +import { OpaPolicy } from './opa/opa-policy'; +import type { CloudFrontRequestEvent, CloudFrontRequestHandler } from 'aws-lambda'; +import type { CloudFrontRequestHandlerInitializer, ICloudFrontRequestService, ICloudFrontRequestServiceConstructor } from './commons/types'; + +const APP_CONFIGURATION_PATH = `${__dirname}/configuration.json`; +const APP_OPA_POLICY_PATH = `${__dirname}/policy.wasm`; + +const init: CloudFrontRequestHandlerInitializer = (svcConstructor: ICloudFrontRequestServiceConstructor) => { + const config = new AppConfig(); + let service: ICloudFrontRequestService; + + return async (event: CloudFrontRequestEvent) => { + if (config.state !== AppConfigState.READY) { + await config.update(AppConfigSource.FILE, APP_CONFIGURATION_PATH); + const crypter = new Crypter(config.oidcStateEncryptionKey); + const decoder = new AppJwtDecoder(config); + const policy = config.opaPolicyEnabled ? await OpaPolicy.fromWasmFile(APP_OPA_POLICY_PATH, config.opaPolicyData) : undefined; + service = new svcConstructor({ config, crypter, decoder, policy }); + } + + logger.debug({ event }, 'lambda handler triggered'); + + const request = event.Records[0]?.cf?.request; + if (!request) { + logger.error({ lambdaEvent: event }, 'unexpected event'); + return; + } + + try { + const response = await service.handle(request); + logger.debug({ response }, 'response'); + return response; + } catch (err: unknown) { + logger.error({ event, error: err }, String(err)); + if (err instanceof AppError) { + return { + status: '500', + statusDescription: 'Unknown Error', + }; + } + throw err; + } + }; +}; + +export const checkAuthHandler: CloudFrontRequestHandler = init(CheckAuthService); + +export const parseAuthHandler: CloudFrontRequestHandler = init(ParseAuthService); diff --git a/assets/cf-mw-auth/src/opa/fixtures/sample_policy.rego b/assets/cf-mw-auth/src/opa/fixtures/sample_policy.rego new file mode 100644 index 0000000..c1ecd7e --- /dev/null +++ b/assets/cf-mw-auth/src/opa/fixtures/sample_policy.rego @@ -0,0 +1,7 @@ +package sample + +import future.keywords.if + +default validate := false + +validate if input.message == "world" diff --git a/assets/cf-mw-auth/src/opa/fixtures/sample_policy.wasm b/assets/cf-mw-auth/src/opa/fixtures/sample_policy.wasm new file mode 100644 index 0000000000000000000000000000000000000000..6d4735bb2b4be254d5ec43e35c4732b0688fc972 GIT binary patch literal 138998 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 fEq5tpL(9*!o#h!^G!G3~G*6Rc#F- { + let policyWasm: Buffer; + + beforeAll(async () => { + policyWasm = await readFile(`${__dirname}/fixtures/sample_policy.wasm`); + }); + + beforeEach(async () => { + }); + + it('should evalute the data and return true', async () => { + const policy = new OpaPolicy(policyWasm, {}); + let error: unknown; + let result: unknown; + + try { + result = await policy.evaluate({ message: 'world' }); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(result).toEqual(true); + }); + + it('should evaluate empty input and return false', async () => { + const policy = new OpaPolicy(policyWasm); + let error: unknown; + let result: unknown; + + try { + result = await policy.evaluate({}); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(result).toEqual(false); + }); + + it('should evaluate undefined input and return false', async () => { + const policy = new OpaPolicy(policyWasm); + let error: unknown; + let result: unknown; + + try { + result = await policy.evaluate(undefined); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(result).toEqual(false); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/opa/opa-policy.ts b/assets/cf-mw-auth/src/opa/opa-policy.ts new file mode 100644 index 0000000..b12593a --- /dev/null +++ b/assets/cf-mw-auth/src/opa/opa-policy.ts @@ -0,0 +1,50 @@ +import { loadPolicy as opaPolicyLoader } from '@open-policy-agent/opa-wasm'; +import { readFile } from '../commons/utils'; + +export interface IOpaPolicy { + evaluate(input: T): Promise; +} + +interface IOpaLoadedPolicy { + evaluate(input: T, entrypoint?: string | number | undefined): [{ result: R }] + setData(data: Record): void; +} + +type OpaPolicyWasm = BufferSource | WebAssembly.Module; + +type OpaPolicyLoader = (regoWasm: OpaPolicyWasm, memoryDescriptor?: number | WebAssembly.MemoryDescriptor | undefined, customBuiltins?: { [builtinName: string]: Function; } | undefined) => Promise; + +export class OpaPolicy { + protected readonly _loader: OpaPolicyLoader; + + protected readonly _policyWasm: OpaPolicyWasm; + + protected _policy: IOpaLoadedPolicy | null = null; + + protected _policyData: Record | undefined; + + constructor(policyWasm: OpaPolicyWasm, policyData?: Record, loader?: OpaPolicyLoader) { + this._loader = loader || opaPolicyLoader; + this._policyWasm = policyWasm; + this._policyData = policyData; + } + + public readonly evaluate = async (input: T): Promise => { + if (!this._policy) + await this.__load(); + const response = this._policy?.evaluate(input) ?? [{ result: null }]; + return response[0]?.result; + }; + + private readonly __load = async (): Promise => { + this._policy = await this._loader(this._policyWasm); + + if (this._policyData) + await this._policy.setData(this._policyData); + }; + + public static readonly fromWasmFile = async (policyPath: string, policyData?: Record): Promise => { + const policyWasm = await readFile(policyPath); + return new OpaPolicy(policyWasm, policyData); + }; +} diff --git a/assets/cf-mw-auth/src/services/bases/base-auth.test.ts b/assets/cf-mw-auth/src/services/bases/base-auth.test.ts new file mode 100644 index 0000000..1395a94 --- /dev/null +++ b/assets/cf-mw-auth/src/services/bases/base-auth.test.ts @@ -0,0 +1,193 @@ +import axios from 'axios'; +import { AppAuthServiceConfig, AppConfig, AppConfigSource } from '../../commons/config'; +import { AppError } from '../../commons/errors'; +import { BaseAuth } from './base-auth'; +import AxiosMockAdapter from 'axios-mock-adapter'; +import { encodeBase64, decodeBase64 } from '../../commons/utils'; + +describe('BaseAuthService', () => { + let mockAppAuthServiceConfig: AppAuthServiceConfig; + + beforeEach(() => { + mockAppAuthServiceConfig = { + logLevel: 'info', + cognitoIdpArn: 'arn:aws:cognito-idp:us-east-1:000000000000:userpool/us-east-1_TESTPOOL', + cognitoIdpId: 'us-east-1_TESTPOOL', + cognitoIdpDomain: 'test.auth.us-east-1.amazoncognito.com', + cognitoIdpJwks: { + keys: [ + { + alg: 'RS256', + e: 'AQAB', + kid: 'ZKgb1NV5jU1UpB49YdWyRAYQ9j7sqIDWDAT/Igv16do=', + kty: 'RSA', + n: '15iW8rGLu7CN0Jr0VWFdLo383p0SxQshC771JuQJObRNspE7QxhSE4-IK2jld0ZdNSuCr3T-cSAGlD57uLMNQYjK27lPyuzidLrlUoooyI4cScRwIuVjPinuATWmgqi1R3-yET1iFGssjeTqxJvW_GXcjSg_NgTpwOUqAZqH4LG-oJqPnAw0fYK4-0lb35MTqQmIJVogaI79PvjQ58FzbhG0EHEzO2L7eMlTBavMZlwbycSSHIqnrNd5qJ-JZaiBGN3HpncT1QfXRPnJyt8meJvWY4Nw_cpNmAHlGNX3S_vs5G7IQN81rT7l2xW_18AMECS9Y6haysHIk98IosIMGQ', + use: 'sig', + }, + { + alg: 'RS256', + e: 'AQAB', + kid: 'NEFxN84zi+HrjY/kTgOP0nAx0wO4kRliIQfdMdaEPlo=', + kty: 'RSA', + n: 'p_nTcrxlc1PCGpovgKlptgOX36-6wPcAlClOvYs9LzHZKb9hL-wuCejcgSJgfPfR_hJNEJbloe1GmqK7xXP7QBZ7-nheAQe6vCIucJ9-uxk1Xry--K-QbmgpiQx3t8We_XWT8Ye-5svT2RshHG-Xi03ZCRLMFPSKuMI38zUS99TOVsG-Kfw1WKm-5x58yeu_IsffJNdUHlGOOdTeZCAjUIWnb22HREdJlaf8k7nl461qkcwarLICbZR7tA6vYnioSBP7i3AeAVH8NXR_OxivcgtYcHZp2spZl42kdlJffh_aVnpfScKMY1jeTEhrD-Mk0sGm5sY61BrueMTaP3qv7Q', + use: 'sig', + }, + ], + }, + cognitoIdpClientId: '5mutv98opfcqrkfgf8ub7nr327', + cognitoIdpClientSecret: '1uqvqt9ebcip62ao8o574kkmmarl0cgvlmpn4ef2j6dn1m8gvj70', + cognitoIdpClientScopes: [ + 'phone', + 'email', + 'profile', + 'openid', + ], + oidcStateEncryptionKey: '12345678901234567890123456789012', + redirectPathAuthRefresh: '/_edge/auth/refresh', + redirectPathAuthSignIn: '/_edge/auth/signin', + redirectPathAuthSignOut: '/', + urlSignOut: '/_edge/auth/signout', + }; + }); + + it('should redirect to login if token verification fails', async () => { + class TestAuthService extends BaseAuth { } + const config = new AppConfig(); + const request = { + headers: { + host: [{ key: 'host', value: 'example.com' }], + }, + uri: '/foo', + } as any; + const crypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + } as any; + const decoder = { + verify: jest.fn().mockRejectedValue({}), + } as any; + + await config.update(AppConfigSource.STATIC, mockAppAuthServiceConfig); + const service = new TestAuthService({ config, crypter, decoder }); + let error: unknown; + + try { + await service.handle(request); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeDefined(); + expect(error).toBeInstanceOf(Error); + expect(error).toBeInstanceOf(AppError); + expect((error as AppError).errorName).toEqual('UNKNOWN'); + }); + + it('should reattempt cognito request multiple times until successful response', async () => { + class TestAuthService extends BaseAuth { + public sendCognitoRequest = async (url: string, data: any, opts: any) => { + return this._sendCognitoRequestWithRetry(url, data, opts); + }; + } + const config = new AppConfig(); + const mockAxios = new AxiosMockAdapter(axios); + mockAxios + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .replyOnce(400, {}, { 'content-type': 'application/json' }) + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .replyOnce(400, {}, { 'content-type': 'application/json' }) + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .replyOnce(400, {}, { 'content-type': 'application/json' }) + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .replyOnce(400, {}, { 'content-type': 'application/json' }) + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .replyOnce(200, {}, { 'content-type': 'application/json' }); + const crypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + } as any; + const decoder = { + verify: jest.fn().mockRejectedValue({}), + } as any; + + await config.update(AppConfigSource.STATIC, mockAppAuthServiceConfig); + const service = new TestAuthService({ config, crypter, decoder }); + let error: unknown; + + try { + await service.sendCognitoRequest(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`, {}, { headers: {} }); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + }); + + it('should reattempt cognito request multiple times until it fails for too many attempts', async () => { + class TestAuthService extends BaseAuth { + public sendCognitoRequest = async (url: string, data: any, opts: any) => { + return this._sendCognitoRequestWithRetry(url, data, opts); + }; + } + const config = new AppConfig(); + const mockAxios = new AxiosMockAdapter(axios); + mockAxios + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .reply(200, {}, { 'content-type': 'text' }); + const crypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + } as any; + const decoder = { + verify: jest.fn().mockRejectedValue({}), + } as any; + + await config.update(AppConfigSource.STATIC, mockAppAuthServiceConfig); + const service = new TestAuthService({ config, crypter, decoder }); + let error: unknown; + + try { + await service.sendCognitoRequest(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`, {}, { headers: {} }); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeInstanceOf(Error); + }); + + it('should fail if congito returns unexpect content-type', async () => { + class TestAuthService extends BaseAuth { + public sendCognitoRequest = async (url: string, data: any, opts: any) => { + return this._sendCognitoRequestWithRetry(url, data, opts); + }; + } + const config = new AppConfig(); + const mockAxios = new AxiosMockAdapter(axios); + mockAxios + .onPost(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`) + .reply(200, {}, { 'content-type': 'text' }); + const crypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + } as any; + const decoder = { + verify: jest.fn().mockRejectedValue({}), + } as any; + + await config.update(AppConfigSource.STATIC, mockAppAuthServiceConfig); + const service = new TestAuthService({ config, crypter, decoder }); + let error: unknown; + + try { + await service.sendCognitoRequest(`https://${mockAppAuthServiceConfig.cognitoIdpDomain}/oauth2/token`, {}, { headers: {} }); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeInstanceOf(Error); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/services/bases/base-auth.ts b/assets/cf-mw-auth/src/services/bases/base-auth.ts new file mode 100644 index 0000000..58d7734 --- /dev/null +++ b/assets/cf-mw-auth/src/services/bases/base-auth.ts @@ -0,0 +1,235 @@ +import axios from 'axios'; +import { parse as cookieParse } from 'cookie'; +import { Agent } from 'https'; +import { parse as qsParse, stringify as qsStringify } from 'querystring'; +import { AppConfig } from '../../commons/config'; +import { AppError, AppErrorName } from '../../commons/errors'; +import { AppJwtDecoderDecodedTokens, IJwtDecoder } from '../../commons/jwt-verifier'; +import { logger } from '../../commons/logger'; +import { parseUrlSafeBase64, sleep, stringifyUrlSafeBase64 } from '../../commons/utils'; +import { AppCognitoPkceData } from '../parse-auth'; +import { IOpaPolicy } from '../../opa/opa-policy'; +import type { CloudFrontHeaders, CloudFrontRequest, CloudFrontRequestResult } from 'aws-lambda'; +import type { AppCookies, AppRequestData, AppRequestStateData, AppResponseInput, Cookies, ICloudFrontRequestService } from '../../commons/types'; +import type { ICrypter } from '../../crypto/types'; +import type { RequestOptions } from 'https'; + +export interface IAuthOptions { + config: AppConfig; + crypter: ICrypter; + decoder: IJwtDecoder; + policy?: IOpaPolicy; +} + +export interface IAuthPolicy { + evaluate: (input: T) => Promise; +} + +export interface AuthPolicyEvaluateInput { + request: AppRequestData; + tokens: AppJwtDecoderDecodedTokens; +} + +export interface AuthPolicyEvaluateOutput { + allowed: boolean; + message?: string; +} + +export abstract class BaseAuth implements ICloudFrontRequestService { + protected readonly _config: AppConfig; + + protected readonly _crypter: ICrypter; + + protected readonly _decoder: IJwtDecoder; + + protected readonly _policy?: IAuthPolicy; + + private readonly _maxPkceCodeVerifierLength = 64; + + private readonly _maxAttempts = 5; + + constructor(opts: IAuthOptions) { + this._config = opts.config; + this._crypter = opts.crypter; + this._decoder = opts.decoder; + this._policy = opts.policy; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public handle = async (request: CloudFrontRequest): Promise => { + throw new AppError('not yet implemented', AppErrorName.UNKNOWN); + }; + + protected readonly _decryptState = async (data: string): Promise => { + try { + const context = { clientId: this._config.cognitoIdpId }; // todo: use something that is unique to the user session + const encryptedData = parseUrlSafeBase64(data); + const serializedData = await this._crypter.decrypt(encryptedData, context); + const state = JSON.parse(serializedData || '{}'); + logger.debug({ state }, 'decrypted state'); + return state; + } catch (err: unknown) { + logger.warn({ error: err, state: data }, 'failed to deserialize state'); + return {}; + } + }; + + protected readonly _encryptState = async (data: AppRequestStateData): Promise => { + const context = { clientId: this._config.cognitoIdpId }; // todo: use something that is unique to the user session + const serializedData = JSON.stringify(data || {}); + const encryptedData = await this._crypter.encrypt(serializedData, context) || ''; + return stringifyUrlSafeBase64(encryptedData); + }; + + protected readonly _respondWithLoginRedirect = async (input: AppResponseInput) => { + const redirectedFromUrl = input.request.path === this._config.redirectPathAuthSignIn + ? '/' + : `https://${input.request.host}${input.request.path}?${qsStringify(input.request.querystring)}`; + const pkceData = this.__generatePkceData(); + const state: AppRequestStateData = { + redirectedFromUrl: redirectedFromUrl.replace(/\?$/, ''), // strip trailing question mark if present + pkceCodeVerifier: pkceData.pkceCodeVerifier, + pkceCodeChallenge: pkceData.pkceCodeChallenge, + }; + + const qs = qsStringify({ + client_id: this._config.cognitoIdpClientId, + redirect_uri: `https://${input.request.host}${this._config.redirectPathAuthSignIn}`, + response_type: 'code', + scope: this._config.cognitoIdpClientScopes.join(' '), + state: await this._encryptState(state), + code_challenge_method: 'S256', + code_challenge: state.pkceCodeChallenge, + }); + + return { + status: '307', + statusDescription: 'Temporary Redirect', + headers: { + location: [ + { + key: 'location', + value: `https://${this._config.cognitoIdpDomain}/oauth2/authorize?${qs}`, + }, + ], + }, + }; + }; + + protected readonly _respondWithRedirect = (input: AppResponseInput) => { + return { + status: '307', + headers: { + location: [{ + key: 'location', + value: input.response?.location || '/', + }], + 'set-cookie': input.response?.cookies?.map(x => ({ key: 'set-cookie', value: x })) || [], + 'cache-control': [{ + key: 'cache-control', + value: 'no-cache', + }], + }, + }; + }; + + protected readonly _respondWithUnauthorized = (input: AppResponseInput) => { + return { + status: '403', + headers: {}, + body: input.response?.body ?? 'unauthorized', + }; + }; + + protected readonly _parseRequest = (request: CloudFrontRequest): AppRequestData => { + return { + host: request.headers?.host?.[0]?.value || '', + cookies: this.__parseCookies(request.headers), + querystring: qsParse(request.querystring || '') || {}, + path: request.uri || '/', + }; + }; + + + protected readonly _sendCognitoRequestWithRetry = async (url: string, data: Record, options: RequestOptions) => { + let attempts = 0; + while (true) { + ++attempts; + try { + return await this._sendCognitoRequest(url, data, options); // @ts-ignore + } catch (err) { + logger.debug({ error: err, attempt: attempts }, 'failed cognito request attempt'); + if (attempts >= this._maxAttempts) + throw new AppError('failed cognito request', AppErrorName.COGNITO_ERROR); + logger.debug('attempting request again after exponential backoff'); + await sleep(25 * (Math.pow(2, attempts) + Math.random() * attempts)); + } + } + }; + + protected readonly _sendCognitoRequest = async (url: string, data: Record, options: RequestOptions) => { + const response = await axios(url, { + httpsAgent: new Agent({ keepAlive: true }), + headers: options.headers as Record, + method: options.method || 'POST', + data: data, + }); + logger.debug({ response }, 'cognito request response'); + + if (!response.headers['content-type']?.startsWith('application/json')) + throw new AppError(`cognito responsed incorrect content-type: ${response.headers['content-type']}`, AppErrorName.COGNITO_ERROR); + + return { + status: response.status, + headers: response.headers as Record, + data: (await response.data) as { [k: string]: any }, + }; + }; + + protected readonly _readTokens = async (accessToken: string, idToken: string) => { + let result: AppJwtDecoderDecodedTokens | undefined; + try { + result = await this._decoder.decode(accessToken, idToken); + } catch { + logger.debug({ accessToken, idToken }, 'failed to read tokens'); + } + return result; + }; + + private readonly __getCookieNamesTemplate = (): AppCookies => { + return Object.create({ + userId: '', + userScopes: '', + userTokenId: '', + userTokenAccess: '', + userTokenRefresh: '', + }); + }; + + private readonly __generatePkceData = (): AppCognitoPkceData => { + const pkceCodeVerifier = this._crypter.generate(this._maxPkceCodeVerifierLength); + const pkceCodeChallenge = stringifyUrlSafeBase64(this._crypter.hash(pkceCodeVerifier), true); + return { pkceCodeVerifier, pkceCodeChallenge }; + }; + + private readonly __parseCookies = (headers: CloudFrontHeaders): AppCookies => { + const cookies = this.__getCookieNamesTemplate(); + const rawCookies = this.__parseCookiesFromHeaders(headers); + const cognitoCookieKeyPrefix = `CognitoIdentityServiceProvider.${this._config.cognitoIdpClientId}`; + + cookies.userId = rawCookies[`${cognitoCookieKeyPrefix}.LastAuthUser`] || ''; + cookies.userScopes = rawCookies[`${cognitoCookieKeyPrefix}.${cookies.userId}.tokenScopesString`] || ''; + cookies.userTokenAccess = rawCookies[`${cognitoCookieKeyPrefix}.${cookies.userId}.accessToken`] || ''; + cookies.userTokenId = rawCookies[`${cognitoCookieKeyPrefix}.${cookies.userId}.idToken`] || ''; + cookies.userTokenRefresh = rawCookies[`${cognitoCookieKeyPrefix}.${cookies.userId}.refreshToken`] || ''; + + return cookies; + }; + + private readonly __parseCookiesFromHeaders = (headers: CloudFrontHeaders): Cookies => { + if (!headers.cookie) + return {}; + + return headers.cookie.reduce((obj, header) => Object.assign(obj, cookieParse(header.value)), {}); + }; +} diff --git a/assets/cf-mw-auth/src/services/check-auth.test.ts b/assets/cf-mw-auth/src/services/check-auth.test.ts new file mode 100644 index 0000000..da952c5 --- /dev/null +++ b/assets/cf-mw-auth/src/services/check-auth.test.ts @@ -0,0 +1,225 @@ +import { CloudFrontRequest } from 'aws-lambda'; +import { AppAuthServiceConfig, AppConfig, AppConfigSource } from '../commons/config'; +import { IJwtDecoder } from '../commons/jwt-verifier'; +import { decodeBase64, encodeBase64, readFile } from '../commons/utils'; +import { ICrypter } from '../crypto/types'; +import { IOpaPolicy, OpaPolicy } from '../opa/opa-policy'; +import { CheckAuthService } from './check-auth'; +import { fixtures } from '../fixtures'; + +describe('CheckAuthService', () => { + let mAppAuthServiceConfig: AppAuthServiceConfig; + let mCookieTokens: { access: string, id: string, refresh: string }; + let mUserId: string; + let mCrypter: ICrypter; + let mDecoder: IJwtDecoder; + let mPolicy: IOpaPolicy; + + beforeEach(() => { + mCookieTokens = fixtures.mockCookieTokens; + + mUserId = fixtures.mockUserId; + + mAppAuthServiceConfig = fixtures.mockAppAuthServiceConfig; + + mCrypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + hash: jest.fn().mockImplementation(() => '1234567890123456'), + generate: jest.fn().mockImplementation(() => '1234567890123456'), + }; + + mDecoder = { + verify: jest.fn().mockResolvedValue({}), + decode: jest.fn().mockResolvedValue({ accessToken: {}, idToken: {} }), + decodeAccessToken: jest.fn().mockResolvedValue({}), + decodeIdToken: jest.fn().mockResolvedValue({}), + }; + + mPolicy = { + evaluate: jest.fn().mockResolvedValue({ allow: true }), + }; + }); + + it('should allow request to continue by returning the original request', async () => { + const config = new AppConfig(); + const request = { + headers: { + cookie: [{ + key: 'cookie', + value: [ + 'amplify-signin-with-hostedUI=true', + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.LastAuthUser=${mUserId}`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.tokenScopesString=email openid phone profile`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.accessToken=${mCookieTokens.access}`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.idToken=${mCookieTokens.id}`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.refreshToken=${mCookieTokens.refresh}`, + ].join('; '), + }], + host: [{ key: 'host', value: 'example.com' }], + }, + uri: '/foo', + } as any; + + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + const service = new CheckAuthService({ config, crypter: mCrypter, decoder: mDecoder }); + const result = await service.handle(request); + + expect(result).toEqual(request); + }); + + it('should redirect to login if token verification fails', async () => { + const config = new AppConfig(); + const request = { + headers: { + cookie: [{ + key: 'cookie', + value: '', + }], + host: [{ key: 'host', value: 'example.com' }], + }, + uri: '/foo', + } as any; + mDecoder = Object.assign(mDecoder, { + decode: jest.fn().mockRejectedValue({}), + }); + + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + const service = new CheckAuthService({ config, crypter: mCrypter, decoder: mDecoder }); + const response = await service.handle(request); + + expect(response).toStrictEqual({ + status: '307', + statusDescription: 'Temporary Redirect', + headers: { + location: [{ + key: 'location', + value: `https://${mAppAuthServiceConfig.cognitoIdpDomain}/oauth2/authorize?client_id=${mAppAuthServiceConfig.cognitoIdpClientId}&redirect_uri=https%3A%2F%2Fexample.com%2F_edge%2Fauth%2Fsignin&response_type=code&scope=phone%20email%20profile%20openid&state=eyJyZWRpcmVjdGVkRnJvbVVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZm9vIiwicGtjZUNvZGVWZXJpZmllciI6IjEyMzQ1Njc4OTAxMjM0NTYiLCJwa2NlQ29kZUNoYWxsZW5nZSI6IjEyMzQ1Njc4OTAxMjM0NTYifQ..&code_challenge_method=S256&code_challenge=1234567890123456`, + }], + }, + }); + }); + + it('should return unauthorized when request if policy check return allowed', async () => { + const config = new AppConfig(); + const request = { + headers: { + cookie: [{ + key: 'cookie', + value: '', + }], + host: [{ key: 'host', value: 'example.com' }], + }, + uri: '/foo', + } as any; + mDecoder = Object.assign(mDecoder, { + decode: jest.fn().mockRejectedValue({}), + }); + + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + const service = new CheckAuthService({ config, crypter: mCrypter, decoder: mDecoder, policy: mPolicy }); + const response = await service.handle(request); + + expect(response).toStrictEqual({ + status: '307', + statusDescription: 'Temporary Redirect', + headers: { + location: [{ + key: 'location', + value: `https://${mAppAuthServiceConfig.cognitoIdpDomain}/oauth2/authorize?client_id=${mAppAuthServiceConfig.cognitoIdpClientId}&redirect_uri=https%3A%2F%2Fexample.com%2F_edge%2Fauth%2Fsignin&response_type=code&scope=phone%20email%20profile%20openid&state=eyJyZWRpcmVjdGVkRnJvbVVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZm9vIiwicGtjZUNvZGVWZXJpZmllciI6IjEyMzQ1Njc4OTAxMjM0NTYiLCJwa2NlQ29kZUNoYWxsZW5nZSI6IjEyMzQ1Njc4OTAxMjM0NTYifQ..&code_challenge_method=S256&code_challenge=1234567890123456`, + }], + }, + }); + }); + + it('should return unauthorized when request if policy check return not allowed', async () => { + const config = new AppConfig(); + const request = { + headers: { + cookie: [{ + key: 'cookie', + value: '', + }], + host: [{ key: 'host', value: 'example.com' }], + }, + uri: '/foo', + } as any; + + mPolicy = Object.assign(mPolicy, { + evaluate: jest.fn().mockResolvedValue({ allow: false, message: 'forced failure' }), + }); + + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + const service = new CheckAuthService({ config, crypter: mCrypter, decoder: mDecoder, policy: mPolicy }); + const response = await service.handle(request); + + expect(response).toStrictEqual({ + status: '403', + headers: {}, + body: 'unauthorized', + }); + }); + + describe('advance policy', () => { + let service: CheckAuthService; + let request: CloudFrontRequest; + let policy: OpaPolicy; + let policyWasm: Buffer; + + beforeEach(async () => { + policyWasm = await readFile(`${__dirname}/fixtures/advanced_policy.wasm`); + + mDecoder = { + verify: jest.fn().mockResolvedValue({}), + decode: jest.fn().mockResolvedValue({ accessToken: {}, idToken: { email: 'user@example.com' } }), + decodeAccessToken: jest.fn().mockResolvedValue({}), + decodeIdToken: jest.fn().mockResolvedValue({}), + }; + + request = { + headers: { + cookie: [{ + key: 'cookie', + value: [ + 'amplify-signin-with-hostedUI=true', + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.LastAuthUser=${mUserId}`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.tokenScopesString=email openid phone profile`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.accessToken=${mCookieTokens.access}`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.idToken=${mCookieTokens.id}`, + `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.refreshToken=${mCookieTokens.refresh}`, + ].join('; '), + }], + host: [{ key: 'host', value: 'example.com' }], + }, + uri: '/foo', + } as any; + + }); + + it('should pass the auth policy check', async () => { + policy = new OpaPolicy(policyWasm, { 'email_patterns': '@acme.com,@example.com,@foobar.com' }); + const config = new AppConfig(); + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + service = new CheckAuthService({ config, crypter: mCrypter, decoder: mDecoder, policy }); + + const result = await service.handle(request); + + expect(result).toEqual(request); + }); + + it('should not pass the auth policy check', async () => { + policy = new OpaPolicy(policyWasm, { 'email_patterns': '@acme.com,@foobar.com' }); + const config = new AppConfig(); + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + service = new CheckAuthService({ config, crypter: mCrypter, decoder: mDecoder, policy }); + + const result = await service.handle(request); + + expect(result).toStrictEqual({ 'body': 'unauthorized access', 'headers': {}, 'status': '403' }); + }); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/services/check-auth.ts b/assets/cf-mw-auth/src/services/check-auth.ts new file mode 100644 index 0000000..ed5716d --- /dev/null +++ b/assets/cf-mw-auth/src/services/check-auth.ts @@ -0,0 +1,52 @@ +import { logger } from '../commons/logger'; +import { BaseAuth } from './bases/base-auth'; +import type { CloudFrontRequest, CloudFrontRequestResult } from 'aws-lambda'; +import type { IAuthOptions } from './bases/base-auth'; +import type { AppJwtDecoderDecodedTokens } from '../commons/jwt-verifier'; +import type { AppRequestData } from '../commons/types'; + +export interface ICheckAuthOptions extends IAuthOptions { } + +export class CheckAuthService extends BaseAuth { + constructor(opts: ICheckAuthOptions) { + super(opts); + logger.debug('check-auth service initalized'); + } + + public readonly handle = async (event: CloudFrontRequest): Promise => { + const request = this._parseRequest(event); + const cookies = request.cookies; + + const verifiedTokens = await this._readTokens(cookies.userTokenAccess, cookies.userTokenId); + if (!verifiedTokens) + return this._respondWithLoginRedirect({ request }); + + const result = await this._checkAgainstPolicy(request, verifiedTokens); + if (!result.allowed) { + const response = { body: result.message }; + return this._respondWithUnauthorized({ request, response }); + } + + return event; + }; + + private readonly _checkAgainstPolicy = async (request: AppRequestData, tokens: AppJwtDecoderDecodedTokens) => { + const response = { + allowed: false, + message: '', + }; + + if (!this._policy) { + response.allowed = true; + return response; + } + + const result = (await this._policy.evaluate({ request, tokens }))[0]; + if (!result?.allowed) + logger.info({ result }, 'failed policy check'); + + response.allowed = result?.allowed ?? false; + response.message = result?.message ?? 'unauthorized'; + return response; + }; +} diff --git a/assets/cf-mw-auth/src/services/fixtures/advanced_policy.rego b/assets/cf-mw-auth/src/services/fixtures/advanced_policy.rego new file mode 100644 index 0000000..e5e8ff6 --- /dev/null +++ b/assets/cf-mw-auth/src/services/fixtures/advanced_policy.rego @@ -0,0 +1,24 @@ +# +# this is for unit testing usage only +# + +package auth_at_edge_authz + +import future.keywords.if +import future.keywords.in + +default results := [{ + "allowed": false, + "message": "unauthorized access", +}] + +results := x if { + token := input.tokens.idToken + email_patterns = split(data.email_patterns, ",") + regex.match(email_patterns[_], token.email) + + x := [{ + "allowed": true, + "message": "", + }] +} diff --git a/assets/cf-mw-auth/src/services/fixtures/advanced_policy.wasm b/assets/cf-mw-auth/src/services/fixtures/advanced_policy.wasm new file mode 100644 index 0000000000000000000000000000000000000000..6cb4ed37837aa9efa64196878aa21b3944f9e7e5 GIT binary patch literal 334633 zcmeFa3%F%hRp+~&`?dBtXV)uLrh-{}8$W|2SnZ_)qWz^-86GjMU^n>LcH1FBXgL*< z)FUB&7O4ZNn4p&{txiNXa11tfq2vm`r*Yu zzsEY)y61Ul#}E+!wXffy-rJw_cy@h1zx>K;$5&l_*`?oe&2z3e`kX8GCF$~`e~~21 zkG?(`E4|Wdw2cByaP`ODsJi|n>CmyYdiLJn_4!j2Y2Gi>Z2$w`vY(C1bbFbO z%kj9}o@IS1rx}lXiIB_6w4XtVG|AJ1o08i6mgSD&Fwb}H+I2=UOjipYO9c5-R{bRH z_4D3v)Ef?qVwmK8J(N3%jU-RF zEx<7!>`BvJmaeUpMQ_m0ii|&BQGzK&cGK(SKWC;w_lzuqMCG6utt2Z$sKcL?atM*2 zH?>De1vW4j5+{A3nhRnj3M6Tf7Q>OX)CZ$1gYQM!*Z;-tv_IGly`W*gNa#lUMzZ5-$C9r@nm-|tkD_S_y^`phdXzwB`G9}JUjaS%Cr)#1yN@7}HoPK?W*^(+W- z^m~&}qz2xf9!3*gD@yU=|4j?ABl)^PP=!a5KPszvmyaaxE)9d{VGz(~&$;y4%MTxU z&Q(|D>6vP$ef-?#TzS>u_GLE6-ct^LnjwQ2T>Oso+rItZ-jv;({Y-XS_Nx5u?02%C z&wo4n-R$SHJF{13zmVOX|4x2i{{H+g^Z%CrcK)IKZ}Si5AIV>r-%|Wo@#Dn{iW`a> zi<^oU6+cwGxcK4X&BdP-Zz$ea{Auy4#l6LQi$5zqTKq$?QQlO(sQlsbm&(_auPt9+ zzO8(F`Nr~B$~TnnDBn{4dikdE&E;>Fzg51oOq$r^XLUY#S2-)yN;&OKKAcYbfc=v@`gL#e-n33Z>b|t1-R3u6)t|fy z0yJpBK#iik8l&&jz~CWs_t!e~d>}bED?*3TSJy>zSF+xWCO`24qe`YHlg@)=@*{fV z<@|cxip1+YTr}nSEOq8Wnxf9dg2IVjSPd~lS2QSwWOds7@Qo(~d-Bs_=9zWoT&2td zNg%rQ_0A&g9f!npelml%10!&Hev-_x=6tBkyR=C`;DT(@B-0$4QZ_lLe~YKAKx4{I zv&!ma&4cNoX5UgZ$e+QhX3x=P&oz@<)M;cbSwk4C)dhe_zQ0b-OA;^VqA;1Jb@l|> z>fo|~$Hgm2M4mAt9bY33+|ZasPlKafl7;@~W+%crcIq@fb|tS1apCpBbmp1!_{ zn}Vld#k2L9iqlXmN;_61fvDM>sMd=KT}Yj%nHU_Z&Y5dO1u!qhO*zf0Iv`GCp14xfWmD5hmk)>o zYNZn)t;-r%fGMnUskZ;)`s&jXd1Ud=!cBa5vR^N(e`7Vj#)A}1vnJ5ANvElEx_!ie z%MRB0dQ&_Zq>Z{iF42AhcarP#l6124AX|QrcOF=!rU;CX=u8a|W6oMPCPxxanzV)- z&8L$~_D*?&B7`vFSfrbDggTI-5hhK)>D8%~OsgBpv^Xx1&|iqUpf0j0GRWD~{nvUr zOGWqpP~Z&vpJBYP-_gR|7B_ty=kO;BzYO52!lSl7W!0lK6z!-yy_>sP8r%6#X6<6Q-nHz+4+Q( zVHd|?bN4STwl@rQQKyDwwqF!1CO_t~k}xtIAqp6;^g8v|(rST467@$uiN@wUU6lfz zyj|8*S1qpx3wOhXyV1g3wQx6HxLa8Z3NaBh3&fE{lqaOmyr0GeYWWnMw*44Eq>rs;*nwH2#V$Y7RH@WnC)*L%D?ddVZ zWX!D3a8vX%fNGCV@Jv9b9`H|lpXolE-{-o|<9!bt7>IH*V1RiSf=BNJ-I_^EfeW~- zqx!8MypZNN`pW7dx|6>Vm#2xDA6IyCvyv$el)z+A5Qt*#`+`fuJ@tN7^=5J^mJ;{mpK*zkC`+ot(rQH zgC4@vqVhm$9!Ki6FFLUid_>_gaI@YdPnK-->w#zzh!HTBb5L8q>bx1RPu|q&T=U|e zZNXt+@bQeo0)+4OW|j1QMRexB&^lemsDZE<0p%9rAL8!Q|Ko*IDrBLO@&Kd+dXUk3 zG}cw4zKt;q{bsDIQdc8g6}no{6;`s}40Sc{^#V7WKe)NmVPt)MTAF0cd07U5sb%n@ zEFf6O!gB4gWNv_~{%fMtbU^Eigv+XK6&D^P#m9t+Nu4pYz#Acn5>nO32LAx8I2dIZ z?sWb2m&kEMinBRG;uS;U`t{Y7B+c@ItVTH)4Elp=^4CI9T4M5N;VOw&QgY*2s-FS6 zVpc?N7r`lf>=)g!pEt*k)M*(0MR)k)a^R~Hvq%dd&2Yj-C|qfWf67?lz8(H4BcJBtP?CT%6o11tXp>IU$%l+}nY01jO(yTqyIH@vW}UR0 zd^wmA+j_1uw$b}D7;WTGP14G zZ=SclT9T$B+lelr2mQ%!Inq}9oqj#}h$Bz?)kaEa>3uN6nE1;XA;aW86+`h1pSS`o zVk;2`bYi|Ao`rJRoC;|(HlJ7>$TYY%)s?CRd-G1;mZn+2V5teBhtPkagQUM#2+bQ( zZ;LEV-IWeJSVS*8Y*x^Mo6xZ6WJ}1nN)M$A-#rh{Ya$Xii;}wwvOVIl+&a4(KusQ= zRc8eGIleaGzWw9!RgBtRpck6~3cI z2xl2j8tUn{S{R=<>Csu~V}917@u5FgIMr;U6Exdo)3Ow4@Y-wCc91feeQ{0Uo7t2Dm%EPOw|&F0yJhf(p--(RnLvJQ5G0Z7{$xcx!rguj&E zPRglzb3u+O_^kJk>&e2nLZ7s09+UUX6F1J9V&-8Sd@coVFzdP0qtTDf`a$XklKQE# z35dC6&3Y32VUx%`sC$T06#SkEzPeH(_!$57S;1?;M$|fj@9pv^h$fbFUaGZ*g{)z$ z+X_Bu0|`FhT=3=BPH}jKF8FFSRtnJNjZMpXD8U~F!SA<%PuJ^#3%(5n!h8r)K-h}z zX*e-t)L|o_Mo*J_x}cQPlFP;qL=3u2T~rpCj ztFgfVJ;YPQJ_K+CFfzt09sgeRUZ>p$MaQ&jroZR zyi&T0t(FX_&t18&4k2xAuS|xlLp*JJ6`vwQNNuExo{}J?Pu68*h~Zo{KlB49HbTH8 z!xp>VVzAin0A!*2WZ;7edc&FND5@aR_dx@hJgH)o6!3Sg(@F@#Vo5>>GECXbg#;ZZ zgS~~25IawE6OtUA0AZbHB)?iAG2O->j>M2UXiK%^EL&wm-IkmKs3=Pog+yW~j}C?= zq16bgBZ81xJf0PsgamflkUXG4h|tR!pb$c%uwrd%qHqX$nd+Hvfr}ebkQ4QF6dUQj^ww6~(s7dKa!ONK}lqmDKuA%#z;yeGmr6Q-8lGXNw|+L5zY+rsg>h0;r>|~mBzxnlUWsf z6$^nDouFmHeQ8;h(^PRp#jQEsN2b9^$dwWl<{4QWgNHnnvz;|7_|nZ=H%@GD6V?=9 zzZZN?5-=TdJ-_1rxL%DKUADu{Rrz{ zk2lwEp2Hv${Wg^&yjW#5X`U6m(iE%-yp0yTeT6LI>|mC4@|a=nLX&_YkE!G{LkL$t zC%8x%2TCKxFkG{j2Q4#|66+8zlMm#z04wI^GQ>O#O@9>c+X%~|*7oUEVK}n2Wf&gv zm}+$idI-Z8@|dJ+I$=0jO%b(JMGwQt7!!u4T|Yp2#^_a$zclqC??9Jgt!jdoan5F+ z)5-62CK-OebNzes>*mjs<}Z?lg-vks9)Au|0XBxv5G@qAp<6)DCx6rd^1qYjACl(8 zyo~a?S@j7`Ogl8z?if)luCsLQVAgj|GhmO-1|dEn+Z8z77pIv?^6BUjF#Qgv`^M=} z`3O?pC1AF zGG$3+o{F-~dCQbVIIRjwtS+`8wi~1+BydVHogP`k1h3MwUupu&db86K*nF9+Xk^Xp zS7T|8EEt9#)-pF}noj;u0&J61Cbp)^Q2h*DQ^(9!yF$pM5H_p+d15;Ys^3%FSoua7 z?@g-zbDx1dnd+BS3I@j&LaSJU>X#LoWkDgFuIm5T+^^IeiqWeuH{Iw}H0PS;m)?Km z;}iTvQwPwqV*?sj%^me!y+FzHF!jQ`Xnu~#zZ8xB6O4&$Y_QseuTzTboRQYE3~=7; zS=XegC_h=(yeU`u82}@<3Dn7ZG_cHgKYv;j`h}Q}Mb8 zv+~kx^eN^7gUtv@db1ge^F3;Srss~ERxuTN0_~%N;CcEXW}|>#EcETBV2h5~D4mZ* zG#m32ETvlR&Qq{FZOsO&*yJFnpiOitvpPk^2eYA8m!K5I3KW5jWMRu}%s~m3pgZs8BiX$v zGws2N(_}PFcE_>Xt<#x@)^uEE!|C%f56wig*mJUZXbf>+Ps`9u>{*(Jo)2PruUTnP z%A{s-9@@vSQ4lCbKtx&&8b2=bOo#sKwB1R-kW76@;(Wz1mbPOowK2vkmMA1X!ltlf z&fTQ?){_8Zm};m`G*nwK_?df73GKzbq@iyYWOx17o3tWke=_CY=KkBcyCD0dez^U( z-#*~C!qE!w=5Bv;Zz%X4zrAN(&^vjz48%Hn5e#1K`t@fz^n@j5%wYhxX{Hb-rpT2qi)NuBv zFPlF#1pVo!0xE(VE^mH?A$hBQD0GY8zQk`qGP43rB7E<040U<${PMo}<^7=x@43x@ z-lHFY-tD*dhTD((?E~TVe!u->xV=S)U68#b;^()whTGTs?Q6pAEB*G3;r2a#dr!E% z+i&mnTcK^3cxS9xzr1-~zySJFs~xBrr~_U`AU%D2a(C!0Pp!jV_I;rrqVfFlQ}avf zV1OGCrL1+#pT2qi)H)R4>S&21%7<*= zycYG6W?z8$7{Wtu<#FN3xm&bi@2r(`32#ro6_!ePXWqlg&4IUbZ+v!lvPDb&)|%q| zjHQLA+atC>d0QW+-pJefWPEo2R&DuPYm4`@>h#-sNgCR^g~ZO-+qyMAyE)yWU;ftG z;{9ypG}?ko;-L(>tnMsxPHPLGS?}ho@D>VbV~zwx*~UFufg`Gsg(Q4x&Wk|g9N2n8 zWXqxM>p(p>K>emJ)P2-{oI!nDgz9;`=JyaW$4#^HkJGY?<}m>*Y@cHb8y(&E#Tth1 zQ-KV#h46Pq(C+k+NNPcosQyj^jQ}~yuz3y}wmIxi#VQ8-YGA`$!M-lS9yu}oPts}u zZRTpPGuQ}>!-lPM*s#fAzbsZU*e^)|4mSn-)^ujDl6oxYX}xj*&kQDl0nF-mQOtLl z!oSZ{`49cn3DR4CrugDZOkw{s(9&;VGczuX7<7;SSPF36%sVrKn< zEch!b7(9&TW`}rdsCSFs2De8At$^f3l7xW|9>k*eq=LbdY0S9+$57CGk_)ongc*+E z4ba{fn&q=p-rA7n+RdeVVSW#L)!q*iprMoW6E5=vQBbPkRQvvV8?8wbCaC! zjx%5;|4k}Ut1COuK$#2$Mo~6JFE&VOBK$_fz$~^&|NVz&5wdtZ`2KXqtYy9Gh?DX z48>F%$>gzF;v?097=MW_c*{xp|ds{J_R!`cRFJiAx6_!MiwIGv~{uWZ<8j0P?OH7!H%ji8h z7~=!WE4zYa)2y+}!kv_#j{(Oh_qOG0Y4?zrt!&G99gy7PvhYOrAZnbC*#p)ts&g{w z-i8=&6Jest0=9r+rx>JGl{&w8@9cAhsfoU0Y6I$XfT^Z|MAfv;jLM%gsy<9yTde4= zcK)<6H6j^zx>UF3zBw(8Ob&{UaqeE5tu0?rdG=&M<=KKODfOC_eAU8 z3w&)P;sVTYlT*(4m>E+is>;cl*LqZg(iYg z1R6z(*-%g6N%^D|mca@nv(OSlCWoYTcyH|lk+uCas;G%K7U|AXNji$iGThBE0>Us} z)La;s*Reug4U$Fdiod}%O-M#iebHL?L@>ZZ<>{I*Ng4n|j9qnB)z_2fBN=Nam4HbC zM{KC6Qk`DBck)`DS20b=6W(WvCau0Efs%wWnlt%{jT5bE<5_mJvGkH)RF6E3a)wX! zK!3iG<1RLGq^{ts88<2!z!g=CN*JL5UDGusjQaLGZDRbBTHwdrY!*7kXnqw>!7kV2&<{x~ z5%E57RHX0u09A6)@Zze-105KW9zh;$oWo>EAiQw}pE8}LsI3pd>&D)hM`6{PkcH<(!{#+hEZYe3v2Z?nVVgKt zMj0UZ4q&yK>Q~Y^Z1%S#Q86n3__#2^27FS# zlef!G$oyZBo%lH(G%wS?lXry2$nNXyv6XnGUryemx3Z#l=|OGp#$b?oZ60tu!6#HG z+b`ubCf;a1cEgF*<~XSh6R{{RFk3h_>JwSU$#&NV3U%xYM9Bm<%u-9=>JjbJiEol* z>c5(<`o^#{$ty>hLc)d}FZ_qEKlyp#sAssJZZb7oY~GHdp*J#6liv%yK^K0Ldh-WA zIPVRp{DNLH=wdr+pN(j<;sDlnV{q)igZx?h4w=EaxWj1=!T>fhnJZiu7&a;@_1M(S zA1nMoSnTAfrdBWi=f=Fzzyx)h;>Jt|XqZ-l6Ht9;r&gWWAx_ON|G*p))!Grx%B?(z z@IUtN*QB|rnjBK%r5S?>&+sHI5|)wGDi7vQwOPH^V957#0pB@5_=SYn%uJ##h0d20u*=x?YL?EVFLzH^7dC|s3 zc1SL4!iIcb_V%?4^?C7D79i*_uinLnx%-*b-2E;L&FYSc+)IDR_8Y&nc1sx zC1`?fXBzmoDO!}g*2QtW%i{Xy-w_ukfQHDznNoFmAbC0z5vB)@b4A_rwK%|wXlK8s zz9rbe#Y@H!@zt^!FZ$+Qt8&&TN>S-h%npB;V!5b99CtnQ0~8kIp&wC_HP06;5fN0v z0^B}6rUJC;2h%LQ-q-`pzs-4Zz<0-qP0jgF#O&!sjqMRL(C!DPOi*i^9QYV7%gB(S z7m!qV03+5-g)4`^oC;xo_Y*2Xu!`>Ydkvu)t)c1?PXZO+7EGH=JD*9{^k;x zIYt*H_UD1O#)}KBVPTi=ofhF~Vq1t!wa^eacb-EnS`%Nub=EVE4=-6Eb_j*e*?)W8 zd&6xOqDb@DL=!2Dy1d%CY_E%BJY7Z zYWx1|gtatFfS0pahGn|Prz0snzmt3-epF(WmBfTw>w|9^%v%8vNvmdb1;pXm6cGy| z2aV)=sXixMa5#$Xz~q-hS*X!JG))bDg@81DPtY!6ZTxp4wSVenv`YoHGDsWjr;Bk%_X9Q-bd}M}~t>RQn)9*w|ER$|0{eV`ZXH(~=EfJ?w@8StrzG`ijNo6I$;+gKrT02!@@94#=Q0|tl z%UXNJo0K;f^TK=$-@fg@imie55J{>;iwFe5T|uxMu(x7+1eNLqQ(}KG^RqBV)P;HhNDo25 zys>0Z&vH?{=02Q@yR_KQ7_5BQx51fS^J#ldbc|qF)M00QarZ5}b~?N@6%$dx3YvON z?`U(^+9BRuc<68d{s2Jk3&6D?&w&dk_%p@4xlG9)2Uj5@M2ski)NQFajt@jTLeCB^ z6#}}EQ*;*vQZcF5ob7H>HI$(5PusQ-&FZ$PThVW)`zJsfo!YmMp&wCx!Ii; zbNZP@BcN8VFT~9|3bZktzb`*@IFgb_p9IbWfsjfY8heeoA|yVX55^8jVZIT@YnkXF z!!I$CBKIfjlE3KmBCw-N>ouo!CR&qy&~dWP6&LW&7B=1dI9*J;Fm)pu{xJBaT^i~p z5*KRBvCvKXLJorE0uvE;EaGn0uzDZ~)P>-Oser`V+)(wF6uPO+#6+%^#+J|T57)v& z0ozCqYhASv>|G0WxFZo7OFoz{7gbu2xb|9PTt#EW7E;3znD#I}VX#wS`?c_Ws|qc= zSRSpn$woYqG%tq~rIH180byZWUB_uB8Aogh-I`%2Py6pUQ=ZQ(VD3X}EvGE9D77&`wzQBgqi zn{WE)&DZHASSqTLADBQ#d2sFpS_wgUPq4S0lzMZm^ z#8@PdAb(mt7!raQfEofScqDeUBge2inIDG^dY}k$tu&&^=0fcDpHs~krB=d1_k|L2 z)oVLD8JZwj)(DQ6E>WLeFa8VhwBN9w5MURj4j@KKln+P`N)~XW?{-nK>)-BN|4!%n zcRSa==hw}HIt15egw-rQf29T2K(yiEX(`d2j>D|0<3Q51eH>qE{~dxS9tGKSauTCP z-|xd&o{{@%7lv<+41gG@C8f}Oznx&6F)J?OHRQxvqFB#G5yCI23b9-BRn5z8?Di&S zPL)ofwZL5ejM1y48gDgR8PHZQ6nSJ$ZskDoZ;>Jd;$LQif5(+cTyaN}OMAd`MURm( zrN6bG1-hg*ok!J{E^HQ1;em)^Nq)h#lTJP}G-$%8-2xg53g)ATUc$PrZ~g{8{DJli zaTv?+vzRfBLX`nFCKTDps&G#UzQ^W!LI9$PIy+Vh$a^B$kGL=y`QyD5qOVf`wUp%f;eTElPd%C1Jc^X{?^o9&VDu;(08sJ)KsP6MO z1jHP*W{9@hNoUa+sp%f0XGq6&0vNvoZE>`!NU9Ajy_~JoBc=i&=!%dlrmOs269hd% z{mdp^?Y^b~GMUOUdn=ntta^#ns$Q+v2q3)R{NH-b6nfQjjb7Ct;5vM|P3H)&fN4Dn z{}i(|Jt$_ts#l}*t@QjMHT7=oVm+wWE&)Jkh*|yFc7rwBQE#tzTs+&hceX|k>$N+l zJDYSmM#grjtM!iQ8A6$2PgyC!z@%&y5>KGOE=k$$`V5mYVN$QbBi=~_ch{pJWx^x8 zS=F0Ky&BlKN|U?loll#N>z(y3N!gmDYz@dr*)BuT5P)7t**4*E@!pyg#-Y9RhqR06 zWA=+%bc$}xgmH_;=~ywHy$r|Fdc;2mr`xJ}8>}aPwZwZ#kIpQl)4VFCWBfefZ_+mx zG`eAfXK17LbOlUGKFFPm7B&G$|Mt}u*8$eL-%6%EU7NxY8TGXTE7HznkyhT;<7F95|m&LFd+rWyjJ`-gnYx+LjaTDA(#@E4ltu;<_i{S zT%%g>r=o|zA*r_VN8YP!oO1ZgYu3dj(^id}Su~|Ez>h>-T|7gLD@{@tcbalpMUAhi z-}QJp(Ws-Ce1yLH2%3%o^?FS{!nS&1K7uKu0s`_*V`f`D3_gPJVD?3C`Zk(4J>FtR zNfPeO%G0K+a%1Epgp9$Oe1tXAV1|Icqi`Ij6+G|}R_AJ56mlQI)VOZlN7$ss73|1I zfJ5m)eH(#=%H(j-jzQjCIM_HO(KH1rSvI+rBhXb;HX6o=jVUT-trr!Qv79oS6&35| zY;~rqk_|tokPlT%QAzaaK=x2N5vG(J%wjhT7bST@Z}`=8-lC!^ z78I3{0`b>ahDxlJR8(N|0Q9i11A~nuipvs_GVw2vU-Bzo{y%HZWBstD%t)RFy$O zj@2m!t`3{+swz8RTF3=eRdiI2xqp{MNn13!>kN;TtYJ8 zqdKmt22oX|QC0B;7)=s)Rh1BsVmVG=?WziOPdL+)$B7aSs;VcCQ@5_FddnVXR8?>Y zRRuLkZ@a1r67RwxdoEqLPLSx*9CU=SSISFb1p&l)I)fL58ci-CU62EphP%(@q{sqnj+&uQF?z zsiSh&+B}x6G<>P@6g1bobe{VpOZBK6WTnR5a^s1ZE4nBNf21_DD$U!iv$xFhJHia} z&-~hJ&yDGB9P(>5)ib|m1J1(zo@?W~{6Ky49o?7tfpeE1>|1{DxSQ`dQhlPZRBC?m zMHckVX(P&XQmN1*g|wo{6WATVFG5bHOfs0NUM>M7HkVR$=xTZ$PU}JL}w37*! z(_%J`fU%5SF-@pW`DjIZ2({KB%)sG^E4ei9>~h7_)tSh26eCpHVsEMiW>lqY*HZu!884cj(v3Ij{Rblz9@ zSB~e`kCX+qxKGH8S#lgBK6vTTkU3J>+>t_LY1Sr8#BY!I;Cl?3auAY@(U=B3{%TW1 zuBkn9MAI1Y`9y)a5=fq^L`TXjlAq=iBR*S=ZmLehWu})vMtIbHX+0*m-H{3>AsNl& z)Cus+*2j-M9qd@+NTqD-QXlzjO9%N-#o){AKGaUkPTmc}MMgaIhF^W{uIosp^}rmd zG(>zxikxC{q|nAPEKD@of(mu4hoTk%2AZV}!LyRy7V)X;(T$QfJJi}aSYe(@1xU`3 z67BSa8=ZDg%*HP=YIkfd}EdA zgT<`Zma!!_eUXdS4+o$BaVJ5PQwh&VC<(JJ1_|fMUzApPn&n|c@sJ-m7%G`c@nB5va`q3)mvKWqj7qd@J*{Q zQDyPLc7qlts!E?Htb2D(CkGOgNjlxhB$f3pOj0R-B+=J@Xn~$-5w%pW-GK^rb&h5r z{y>pD4FY1Q$-_){DFXAS3Q5-PfTW~AL=TH{VqH6=NabsWQ${1Oj|gQKdIJ`m!Qb7X z^`3~lryF4JmTK5D-5uG`-&EoZFL8#3GjnUUt;1l~XVkkdR(p&8)w_)sgPyGcVGgr9 z>E+A}tl1@9kGv6KhkpuY?|4wm09~Ka>iS(Pa#!pH95dEMG;kSsbcxZ*2rN*uuQ0H) zGwZLY&%AiHYwv8gl>Y8Jr+XpOSt1CEf3-ey`UrK7Vkmv1SV$J00iE~IX-|DdQ2b}m>}tLDY16Z6Qh-wYq$!Wl^ltg|*4cp} zQPpRl_;(2x6#rSK_{Bi=E-3z8QvAC02z-}NhoRUm3%Pey^)5{y%A_z6J9*l4CrEPf zZ%jK{ZKQ61Y%28FMRR4CVq%IFJ5x&BG;rL`loo7p>&@xIZVRmRP>k}{I-F#gnFstq z4Z6;-BL#x4lZrEaE0f)|U#Kd%o9zA7B#QPKhe;H7sZA45X0uBzxlq1kZojmXfN|@q zja|szk-lHBN*%1<|E;Z&Exq7eX%)2)AEmQ^9*>mU;<&t1q-HK&C!DK zCA~H`X%?)z0MvI~`1F8j9#gIhCG5k0#A4dY!yzunuL+4f(M=X?IX8(F2x`(k*sPK3 zy3*7joi&CS;JC~unOiU~raP^JR4q4^FirW0=`IaumUX!45NxgW*vf+KJhcUbnSnKX zWWi){EQhFnirG%LP=Ky?wH9oTSuoiNybd2r5e+ODk1jDUdn4N84F=S_B5N3P! z&UQ*e?Q{!vrU+sd>?@`_)P0J%1=|xtmtD~L5%f1$upMT>%uekz3-$;R<16bjSTLbf z`x_(EBkEnjg6)bH?93$#wo?|&Iy*2V+@$OgE?BTL&7>HSMJ_ifdt||M>n6q4@5y+H zXC#gH;E60+uroliwP04;ELh(x*d8oc!g8UrXzmPa&OT$Vf#c0-4I?AI7n+kxyQKw_ z5k1HRAnDg&!Ga<*P2p2CyJa|bn@+V{iBjg`6M~M4m&2P_432W*N?{d4lpR;*K-am^ z+&njd_WMBK6%uwl#4b|_6`>5BgGNG7TTmGdC#RP@J!3?{VUH#K8d^m9gujOV3d@Ov zzSfs6bd#Kl#E#u^QtLXrkIaOcVNQo;-5&GRh%9Wl1q+3^GadXM2A#rFyYtn>N(=Z= z-lm|BsdG(AO8t+Nv9{VM?!|{BPyzB3ON7!RViHgwN1~>PeC3hg(?Ua<&*(QF(pKi& zYRRT#4Mr!lsyg04D6|-ysv&wMIsoQ_3t*V4-3p8s+7b*v3`hD0m*)T-u&*M9AZp4m zmWW%)WT8aFWBxEW8y`ypm7Ug+;wUjwLWw0wlp_IXKdN!@y~&;gow%AvGpN(kMI3EP z%PY0WdAMbAbFx}!G@7#6pOy)Zt2&D$W|Mb`&+Xm2jqB90%%_)lPkaV70wF3@2%Y}z z0sF1sw6Jak&4df)YbcQz_16T@F;^g8i&rxLrOC-$LL===hHTH45w9$bdW<_M7!eGU zV+6D5<3ZpU14-|dx0mh>PthG@4V%P!D^=pR)?F!GzqOun6M7ag@n4T50q)HFN5BXF z-NX|43=7QNi$jkxX6c=eSsC;0tyglXqURc{Gt`!b6-&op4P*4wY)XwyN_j8();UsY zadatXGA^?+@!j0eLu|r^F+i7^n5zJ#bGm(zs{Dcpo1r1Cy&!DY9X^0> zN+?>(YIJVbihC}Dml#2;xVxwF0sZ6lcwf<6pu+5gCWfH}D^lh14bbAYoBv}P=FPaf zLbgpLCPWGOC@;WX!|qog$-1Z?v2ji)2J4lg`(key#tp#zjqh_bwT$kM?`3 zopsXLe(Uipd*emVwm*M;;q7($#%F_8oJh}`zS4bsS1?X8!zSAz)$oBiGEbxsn0pn+ zd?7F}&6%+C(O?=*UWl5mU$<`!k-9pj&yi22$f_OWL(df}a7d#7TNmyAx~2PLOZQe- zD`}>hKJic2;BP|$#Vtq{NwPy)--~xTO_9miP^f70F7xw^A~l3Qn6anGpO6fT?yVv$ z;IIZ8l-be5PZCC~Iy0hzx1k^3$TzDfW4TL%ry6)^vJW#ICL}*Tp<2OZ%0e?srfAD5 z(ON!bef zj%I7~O=^=SwMApvq_&-Pjg~E;*c^z*>kwFbw6-hX&-{&LORPoTj5e0byR*(hwnPDS z*ruj{ie+;li>Zk-G7{w8Sz%mnSH6F{^8MSP0#UDZE@n%ZvLd$uE~GDfkB4R4MV^>| zXT<3?Cg9PCa4gj_N%9rQAjveHI1zZ;nP&+jmLCz5BsvO(4Idf+!+NB#YX<~NSu5|( zIziMo6jU7Bm#u&m&-W3aWGn@q2X$_(Nh4|9t=SCZ8-i84WCOynugrLITp{Yu2=J(`bpZb3lL?BF zN@Hn#X)iV@6xyVaRokdkr?MZ3H(1#rhtX7`XH_nl{D^cu>Lqmm@LWtwt8>&=EFGa6 zf;4i%c0y#;SE*1`vZxzjlK9k0VpA(1{?js4Z6RxBj6${f7k#Blw#BxP3xzQ6!iK}B zsFkCY4MxGhEB(#k7YMO#Mf^%4zjUzX)FePN3aS#hWumF|jcrzdrqoTOwz^JBxaM8x z8MT`_cobp?$eOB64h$YElTNF8;29-d&7aZx@Rsj}gewmI4p)2HtFxfXQp0ATk}pKV zIo?D3``MUMBhi;lsnU+Kt|=XS*_3|Slxp(&VVF`>n3+=MH#eD5`KCBz58IUf-)T2S z%cXr$PypvAczZY`NywI}NeqcQ>*!FFZ?5pkvZ)qFv~OkGeTR}rAm34L0RIW;<7WQ_ ztU>vP{0z4w$>J@T$d8QiYbW($`s%-weAl$e{RA|Xvx!n>@|B$~>@2K-d{L=>J39b) zIL!oe<{7f?MTS7}h39Ffw6#70eyU6%jF)XJf{y@aw7xb3yv7^oHo#DanW4U79g)z9 zr*DQk@#2~zEi7O{+DV54kU@%p_+}qi6DF|(q7r}8huRT$KsR^9jDPHidWOs89dUmJ z8Q_6s8p#q?Kb`R<5aiQianD7A=PY*#&6gxp`#ZptNe9W7t&sC&VUkdM9NuZPEK6wX zmLj30Nhl+zg&-nw@A9e7!Wc~o1*lw!#qg&kv9^~gdBJ1GNDxkQlrlL}IE65usWUA! zgzqf5)5MElDndtSA-I9;wIFRp2Ru=F)ts@($1SPgF2`5V;|6u`8#+>2az+_W>e0j* z-&)Z_mI8L%lkWB3>O0e$4$%~y{6AAOrnFEXueb9~5^>CQP;<2=1PQJ=LM#?X!>D3?^2>sCChb@Sm^fGF^M>=qhI7Zjst}xc<(-7b>A@zu#uwXYeED=N zO>6d8O@_XyVN+73AcP`yy?p^NUmR|eHo*|=RCXio9a^gdyeJ##Cj|2R3v(o?VvWIO3*C9 z=C5zv438CH`JtkOn!J7TEaSLfBv)i*!#bnH>I;RLfQW}^!gIjqJQ(QWcP<+*>y!>KSD}?Qi;1ST3MwZY1B4Cw-j=WxZfAAH+QiTVk?2E1Fd` zno0VH-WWF~_9DN;z8Az^<^_2(ByIVYgq>#$0L7+~KKtmkr^;js5Ct(Di_JUcGqK`P z_IXN@i$WRHZfvoK;`Hzh1br(8GB{mZJl%nOS-uYfugw9Pw@V zi+VcAmbR~%Vei-%x3|%$>pJQkDb*z(M$u_%;-#?8BLK1jB)~#v5)zQeSpqX{8` z3VJI#2b(<|nO0e5KIwpUGj^Cm$eD6oSH`w)Y;t8tWd>J9rX5#CUp|Pg4A&SdcCbBJRG!Vp)o$z12Osn_LOIA2$O8?)f9`~J|%>yf*SYs6;253l8aeH zXFWAU$yF?P`|Qa*xwmhjdF$=FJ0HA#Tb5zd-+22W#1Wg7;#l_fQNjz}KE*rUJ|o4v z{f^P>d{}87$=g5lLY>2=2Y$}8 zgrnC}z-bzrY-g+c_0b=|E0p!rq-seQlUpLd3+lfloq_r<_f9zh#5QQ8wr3px8!tA?Vc*6Be7L1aoH}t;wi$rPJr1_B-g)$sM9Q}(y zGm>PKQa;9XYLp(L50QR2!VwW*UN17gu)M)VwEd zy=I1i)yC=|uE^dzIPF_-YU>~R5r7Ayp`)5_C-_7@;jdw$BR3?jrm&6rDG4Ci^v6)=UjYE2el^I@Fxu*^jSgTLzFBT?PhG3ZqO**B|tl&p;8nY&| z{wbLO!$YQE$XbLsGZ^`EW_YH+n6b6)*oqmhI|4KEE;CRso0$!0)T4di;J7PK#V_TWmwBJ|s5!J@_S@{i1-wj+ydQqPP{LF?LVQ&6w6 zv+?Ugen>R4J}9U2qh{uaC#hkwhGUL)Myt2%&70~ojlNOP468Cf}3foPeI3gl^2fruXcXq6yeTQ<$&HajXobm)BCjidyt1tpl7St1Xp zaYwt?%*L!&nvXl_%{D`q&6QxA;v=@1`(8HgDpP{!ZX=MrR?d;l=5z|Ap@1vFKBpf? z)o%W+lpv)S>MfR(i_~}8+bWVhGt+$}6P@-lX!OF=Mi^LDZb|nIq8)KVq?zKb?&DCo zllx6}tlieSk3^u9oExHGcU||%K7}kPoE8sscwJZbQM}_fVZ|oW4C=_jpt1oa@jE}J z^tbd$ZN!}$+|uSlAHb1tXH>cqz)JPbrxE7ol2w1Yy5NXq=a?gQD#t6#B9NuW*^?jZ zvj`^o=ggyS^ODRb<7A^a$T|Ij)9TevTrg0=xibC0xqb+5>wfhy=eS>eTrNszU180& z#qm~wt((A+`-S^=j-e0)0_1!!AmlV=D7wRCnH-y78q&CYz!85nMaP;!osbjUO}rDc z{geSgAF_NrOdi@0#buL4ecKtOF9X6E&QQmvVfb*(k@r#!EZq}n*as*nt?1aalI~&4 zwk&Rb4W1G1kxM1Y1Vvbn^p5fDu2Gc8l-jv#g@n9)w+1WYW|a>(Q%n>s`u_s6mjZy41`vw0o$`hfUXLcBaF8&ewA0+oX*gU9SKlqJ-Eib zy^utKi$X6Q62Q%Me#7|zx*x3bM-oPOO=W$E65HX2po6ImX2z|0E>Y|Yp4YQV^b zA{Ap4W+n8Xt|aVoBd4h$z2bHjyll^8(Oj=p>u4tq1eKCtp#e1HOOOFgu+UQPFqn9y zJKhtE&U=K!EtCpn0NTfDiWo4BU_?ok@iB1T&}QsJPv{_XD%0QvQab6T$)X`ovJfC zZUa0-Y=T3{V6e$(IJe0qXYJ4ZB1X`XO`WI`(i&4rxieq!U z6Un!%3G?Re!}ts@Yksw;0)y)3`O7e}hD={2#U_}&XdOWxqf8OYiR{6m`803YdXPQi zqRsL0)kOY4YBsOWJxH75wIc};0mDV#E*7PbMNx`jttLb%P0+N$2yfAdtl*U#jrl<& znP&6NNgoM9Xn|#RG;y8diR2GF^VhG;h8ss8K)ZMiL^XXkK4SuXVLk^Lj71_|z$kIBeO(Sz6Bbi!Y zEl*9jx8&U-qn+SvGuljWq+F7rojaRw{Y)HW6Cf-&ZdkrmJxn-jlSS`eMA@#j-4E zd10I(i`c)c*|+p;AJ53jFO;jn3cITymEtK2$pSPk<%N-~EDxhv?21t>>xyqNl{-GN zR-hw0d(`x#POY44fhLvDvizS0|Afy3rR9J>*vcdbev z+Kc17*mU!QH_v%y)3PFai;%D(rK%1K-XbQ0MN9?@n8>}AwmyAKUfsn+vqvzmMZ`%i za2JUd`$Y@y(`>wVM&Wa_$LPhr8Q+w-mQzol)aqXLfD!o+t=M;?D1*YRSHbh#?8!J3 z~__$vRe%c`vfe>rYLr`kFW5`5^kPh5td*Ra&BoI zBN@&Ap!xAhjMEdkV&BmN=J^SJsKz({9AZg?LSul^1N47-n9YQWk~5`Vu(1rHAHWGp zM2pES=ENnFKYM|mfF`i!?4PvkcNzpKtJ}wn3Kxo+?+QmR^5;71ocTy)>Ls%MH2i*f z6!wk9ox!b>1!E|h=lm&A#IUx94UZ@PT{R@ii7$z!qfk8wLXkVUS%GCjQM7>-%X>v` zJ39%XAT1=8M#YnHqXNFG?E*)kJQ(XiB`6*GM!TiNr+T3$<}Ul zEqmYT;c9vS{5K|ifU~yC;<34<5#65zL3tiF#r^nXwfSTcI-sS|GVtoR0EW(MO}h0A z%gu#h_30BLDJ|}^mM1R|Z_k8sJ~IQt)Iq6j=F@HI+|&OY@ySpUw$jpwQ>tF<$%5#&X`LTDu^DoOQIE``7wRL(V+%iu5`4LS$DAXb_6D5HJ zW-aJdS!w0hAp&hL= zaI-sV$2&ls&!?FKXx^jR`Vu1PE1hW%^;RHZEJ3%|)a{^_d(Y9d2hGDOHF?MrL^&xN z9%!=xKUeGQdD&I$Ik6}g;YiSUWpvMM!F|5pZcJUme@k8=2nLFut8E)bP4?O5FDb@| zkTw&eXF?WMXM1a{45Jqr2%vt^VcHH-r&^>vT&Ke|?yG+Jo^Wlom_VWmj+?DfLGBo( zMrDZ#0NEJi9u70h(9kgV^O~&R(_}N^(x``OX3WeJT0&J$^CGIEHMpLlX?JlblbxbJ zh@C)({^(PLEwXlIn;j5Y{bH35`DknQd|57Z1Ej!)GFFsFW0AzHCtqJYG3z6B zd?pss z9z+oYulXokdex4?P75+>HYgb@Bx`M~l=d~BFjnly{4iFagpHNrh`v0#d z^uEy8DB=@@kg>rigGzHLE)kOydj#dm=ZMG}Ez0g|wCLM@^qsFm+4&Coxmw@m6VGsg z!)UQBf^Y*vh?D?`1dgeVP6K!I+atavwI{<@a!Es;MiVlsggC@ub;1|9W*CT@mjv!e*KQ(}zOf6Tm!8WeHF!$j}-Ktqe|| zot5G{>H;%ngSJ&ud`n{xkkCy-xm~b;yzx+A5ej}3n?YrxC7j0(#a`Bhw%dV}3gkpk zzc@(ONIk2|t_9MV15QA5zDV0lEq;qvrMP>T(FLclgpse$aKw%VfB?b(SPBVJ&FL_Y zIL*V@FuRRk8_)EK_wh`hcyHZ_Hwui@J-ONPpy)rd5~c=hK%1=tWt)qMl|l{W^BF2k z^kBU)U%cjfGdjR2B%`$d)lZJD)7Jga0o78dcAB{#u!7*ESKE?4allrS`9v}R;I|;! zAxCE8F42Bw=WT8@9zqOe2btiKipDC7I{aLXQ)dOpHlfz!KL+)#r_j>7L+55Ax^#nfONv9{%iMpeNC_nU63OM(}mJn1Xem2A3 zi?=6Hzyq;CL&`CS(}fd-)v4A~5nCN6@~&5+iDD2y6=^cp-98o^CF=yLmJFAW%RmPL zt9c$?OMZ(ZP2nx=S^~xJ-4eTWp$oX>TXmsx;uq+vAHgXe$s^`}Ju>032bP;Ae300n zo5)hP;c`2`ZIIEkr2($TMOE2(b(bD$-pbfM^Wv%kdc58jjw9yD^Vrnd>_)dYDe3?n zbhP;?CYBD#?2wyyqB-2Af4+f}Z$g5GukRJ-C{C3Iv$z?}0ekYvfANqP!HtP&wu!&{ z5v9KPmGb4UcBY8 z!P*C&4L(_t+3-Bdj+$qzuWrkFy}ajt(q7W*v5gc%m?`H^G>8zQ=@i**Y zQt+7HRC&*E~&=_$P}O`o;MB zpA>l-G*=O1HzVs?Q%itG&ArJJB|Lo=K8>1}0jig!{K=pKJV+l?I8w${{#n!h5=@Cmp(rtknkBxqT0_SIuP49$UV8#9h}yZ-ri zK#NZ!+anHc8?7sKNp?|dn<%2M_Y9h|FJ?fD=*@NjV^EP&`^vrC3?i5s4~@8k=5M|O z4?sp^ZSr!{N<9;G#`~%yNg^iH7kVfe-@*3)=G_|CJ1o_=qu!x`snr(*c=gV1k9Mj1 z)}xVnv`Yl5`&Z)6_pdm}8Gx}vW9!gJ9U7|ylO*tq4z0kN5eAl}KGvZyrsf?2i{|WW zLw|N|)gSB8U5WYqISSBE?oeMncb==6{-bjFa9X+- z)Ub^5Z=s4Ow=e1&n|B*g%B<=CL)KAhZDWFAa?-h(eUqJSAq8w8l{Nj0O;292*pyjd zC2(;r4lx^>U;tR9Okho$7FBV`&>=hUG;89)u6+f4@-7germm$$$zc#a)#Wxa0UJqT zPvv85ewJO6~0MAy|^x|dk2$c zb`XQiJRN3I_BD^C_^LZ={bucuxi?0AiNr+i4a-rlH3fv1g9RX@38UFbH}`N@>d{Q# z1zzg1eZg`5>LsqoxUdt!+`Y&t&9zBsctnGnr*$V@2GXi1qhT&|gsANtXODyTm`PBS zvILY4NMu~5$Uj&M3Jt3>l1wbN%_}LhNwp^0p=DA%&}W*Imuwh1G^>J#IW#BP^8GN} zq>=40lo=mVGWQ@^f2yz?SNY1aIa@=LOrrcrGQLNokjKs0T2G6qwzW7)5>H+y^?xQ$ zC<&rWqD1JN%C{L5n*t@Crvk-to&d_kV$@9BO9n8)Amq$x7OILrX+|d@0QY+I6kLBI zs*1bxNqdEkV9+m~WAuzB^&v?)GuQYVWmEI@Ay}z7t$W)i`pgnln2}4H_xn@mK_ena zJy2Ajl#hCAl#)06^d)fZLLR}z=j=yk+ib86%E>pXRLcm%C*R+AD0P>sa z#1@77xEA5@BG!N*X&`K_pJQX|u1I|xbcyBDS-hj9?6+JQu8q>IudpR*z!dJLnDKES zD5F37JP=f<$(>oRhctp27*wC$mG_V5$Fi6oBe^v=2ghjxk*5R9Ut9*2MN_48Uig2V zAm7ErIE&tX*4#Huq^aCRI?e0B2S4)QGi9w90Ze2dSaM?Iw(*P`l#tGX=STZA!s}l1 z{hq<6)0&mVqdPdo6t?m->c~VR0h2UtezsYj7zf>Q)I**|XliJHa-;uJ2tjJQtyl|` zG?^+@vN>Pvb{qX4qRBEQANGffsQk4*+yWOgkbEF0aZpF*+XOi2vx8(3zTdaTXeiG* z(xV;Z?WlB30urtCRFWPtj9uyJRx$FaS_e#cwurOH%v4#o9No7)ljt$6X;6|a>oETK zv!G?e4jlMh;J@$PivQRRY4)Ma0*4l?n2eF!ut5S#>Yu!jUpfX3Hg}XVA-TBy7e8Ts8_Or&9z#sfx|<7Y%fEZ0HciF zPTBOss$ir*$5&9(Jgc&K9I>tLV7DlZ*Mxfl8IcMT4e>-7U|;Mj>9UAQ@KIGdvl#*E zj0I26nHy8Dy)<;>zQ*+P+Rt07HVb>5`ES5otA}rRxq_af&Bg~$Y$WSs31*YqXWK&E z2byQr@j6MKZGy4w7cBMyZ%>>R!EJ={_33tC({Bj5U7}4w zsTo~4TV?j(V6*SATrHCQXdgY7r_U505g!q1#eCyP`AWBr3=xJ5goTL&0g5d31|4$Gxey?q}16dMxTRqvwLAb!tdDgwWVX8Ufjo zG--%SNX^ORUJhs2UC9Tl=kia%=Pq99^i@Z3+w?1(vcST-J6OTwb+Q+t(T|yo(7!V;9-Cp@D#0|k` z5v?&SqLrLpNfg)1PVYinfvU@H%aYUEt@5y_D%5cJg4-gecOE^L)eA@c^muxVDc)oH z?QiV|)2oh$OZPDi-=m-C_R9N#AIpZtv#IUg{o*H=Y|3o-mf7flyUq{xZ#W>wn?Ikt z@Wflg$ou45Z@cKSZ@%i8cii+xd?;&l;4wGf(LA_zsCmJ4>uuDX$?0NfN5el5M|F(F!hs*ZnfeUY|SDOd>>vtY_%n!Vk+Gf6D{d4xe0#)dy zPb#rjlPZMU4Vi%Ezq5njog_}C6R-o%m<$+RbpAJ=^*8Uo;LHo3EkPa{1{)_H?Us?6 z--1d9=8@?dijed~y|&&Ytf^oWsJp&dOv~$mTbi~sbwWAPA^HFl)mB?k7}nJ*Ada>u z{UlxQXjGQwHWKp1tl9=~AY&GHcFf`qIT1VP2S2Rn zlM-B2DVdL*0Fp-&%tq;ka24R!ugeq+>Q!ZYm_R*9bGVRabH!d>YH^^+Jm0g1Rpc)T zEy}9_k#RNJ5uTmjJPPz#Qy`PK>P719`nB0-J(31obtO)-(tu^qfD4}ScB!tu!w;dq ztR@wKWh1`)FYP2pKRQg2jl;J=$;kL9Q-ru68 z^+eS=q8*-X?lFnyZaJE>+)*W4>b{lPQYB?P3#bd1B)TD68d6AAkfen^IPwtIH4GweVmq@lB4C8?koEJ(FUJ*CSoq z2^p1L-lrnfPE4ymWr(C6PE})ya`RVK;sr%o9k1DmgNkE)T*A849Qw0WhCpxfQ^F0g zlW!|QHeoKBr*kHMnvnT!Ql@@NTdSi>W3`QWgM1piKNAQ2t>4@ z)rrNEUX+m4vh z#tg*wGO^IX(nn%DE1ls9fEh!AZw)bf(}JTbnu_5^G@vW2H$`&h)Q@O)F(wsdfG}Xf z*bvwHy3YnvTF_4y-}V#Q)vu&J0T+6JALeViGxA2Z&>z%gth@)Dlp>@9 z0mK^PY)c2$U|?ZkPFqmZ-(H3D?ZOq2QMlrhG~o&X3s-O~Tp^U<%9cfE+QDZds7|V{ z0d2^dnnas`X^=3cQxiP6VxnfNaaj~-zgKuyHMW~{iqNaC0?;I3DLVXwtsA%e&HM5v z+FoC&ExToYjdBP#qlMW~B$@iwdlLY5=r$kyuP0iYwD>jVh=6`SIO5ASW(-`HX;u`K ze9M1sD4X|GvNxW12z++CLG??OYpcic7t>nL#R*AL(1v^fU#xsM9jO|4gn4^>CilOSikj%kLE$<0y_5_>vG{; zW~qzz81U4(`~S1|Ho%r$SAFOCxc9z~`#x?g+K;3-zGT0V4Lv} zh6phJ00#`185-Phf+3?z)z>c02xv(MgZueJ7CYp=cb+M^h*OF;q_ zh=3$x_2rxuyzueYeg7*TQYa1WXqTH^o`>Q*k{DhGSonaw z;k|6TrY)t-*d+9fxUOLz9O_6XB0bbq;KXo)PD=y0>VOZS$HP5{%BMBdAnaC0*s>!m zkw%RUUx6l!r=x~f1+R}<^ExXFxXiI5FqLM<$g`s>hi;W;)5x=_D`y~;=H5tiFPBn= zOr45&I>goyFHudQUsz`%p1d!L)`G&0V0w2>pk1A7!^Sp&CEG~Nx3 zmvyZ+U3}bUV(e@fJ4%_ZN}H+DREcpWM(c*r>I#xg3P5)|J{vU&nrsD4XkDS}tR~j| z>ZV^sd(svg7nN2c?jFp50Ih~KX4D70Te>dlG}Q=U@l*plQ^^RFuT~LS%t)(<2w05R z*p7gby(AKG3=C948uA>zNReU~ekA==?3gr`7YTANV>`V9+J}A0o4Ue2;osXCHGpo= z4{DEou;%&D*~8E{Xc#RDyWeOa<#z0TqoI`eJ^fB6>vZr0Rq8!1e0Ty0XPl@D)NB%= zXZ=G;j(~%%F?7DPB_DOid#tQFPU>e1G)L5ri?Jl1P~h3R5rWV3v#!|eXf;)yG}6;q z=52(`V}a#&LtaoQDp1J8pk_!rN-gauHv2(~b!`n+nY_`2MaYIFY^;5-9bgafptIZz zgtu7I%#lX}0<+ozoM{YYGls(E)l~4HtE93vLx#H)a8Oeo4-8}(?sDclCA4^m^=$V&)&22~-><^#xoO;-CF33%XmUGU*z2fr)x z7t(JahD7|ZgN2T!JZxO-()74LPSuQe##VUDyt%BayupTBw$$tgCDSW1QAySjCw&L$C zFvPEX%UgfwF(r2?&ioTOEuMJSTW--Y@#2hr&7McjqWF4+3^=6uKJ#P$w0s_Cg%7@b zU^iiakHzS+SG{GMqR`pimGt5K?^*+c!r>B&!sM62qj+JI=UEw6 zVc?01$Q>#%w*%Vv;D9Sz>dlTmcJ>#?VE97kgC00>7H>b&pC8k@3V!&ruEUoHPV8TPtQo)RuhED+FULscoI2wD{+X5vjK*nr zi451NDL3ikS^M*wDX7oS zkAobxK|G7so0}PJpv5TK(0BUg&$BwTc(nLcZ!xsD1X^zKXemmgRV)j_JJ&Hr4%XRa z+zB6iVa&qkF|3$`2)?Ak_2#&QFnjo-k?$53^nXLiOtipbO#1uaiTSN)p_`{A~63tz2)`0{-UaR+c1b zQ3zU)MWkRmKi_L^LXgU`VCv{E7}{azNB|oZxVD&TT*Is#gsmVpA{}M}Rf`z~BFW6B zqGdFbn}-dfNV$RYlf^V%&lyGzb>st>k#UIBE_Ost_2iX$Lblm*eay;AL{05C3r=alFGWd)RyiGki#t9u+ zxQYS94;bVYrI>j_(vw0`Grk;~e6$F&zX;wT&jC;0q^A+3%zU8<0_%{r^_Ny#b1?p; z6~|L4N9t@hNS*pL1l?&iI>};zi`0;_P?FUG7wL^-j3P}a$pE5#JXetgMDFmE<-(s&XN4xM=YKzat&o1Grok`aSUFe!d1SNAi#p_+y z9SB>1uqTlU2;*iigRs|(2O!u5%L$D96q&#D)b7d*2w((`kzp7*68o`})w1nlPIiuI zaUPs%zcMnP{&^-@UCrJsW`x-lC51c$1^WxeZpGPXb#q%xlgadlChHSs5)y^Kno;F- z&8F*{Q2?m*9*ceeWh!NeWtiZQ2V8vOfcusXT%9u)8?nIF`AMYrfk_GR=eX;U;*#ol z+HKMlQ=S*-BY1_=AL5m@M6iulb-YqSD0EvUMOZ|n1DbGfSLVJ$T%!*YSp%lPc3&HD5gcFWBiht=onfU;xW zDrO(G?&O=20r_J~Gp2$|?<~M%Z0c5p=H~3TR2i1WeZy02^1|9U9=)=O*OvdqPS9@W zTKlhX82z_nW#AzDhVpN$`fu=@nW!GL5&Y|H1ecNxYouYpr$Bk7^4~4I3kg9+v)}b7 zcv4FaYsRq{1k3GR_wmwL=ED$@X;tU{N+tqP0}4a_7!4{3NQ~WmM<2PzUw4n{Wx4uhH8p|%&U^^q`~SS>{|PC-bs(~4e+`=whwD;F>>Qj-zVwS ziBUtdfHlfPXFlCojP*-+^RJ11eKP-A)2~nGU+dd24b!Eq0$C76BM=|*cTFNT|4Gnq zw7+G*$&jf7d7$H`X^a7kMPS(1{3j-H+(BI;k04ZYW=88 zQhc@KBtH^jX|8EQi_gj}7Fr@`J~Z(SY%EA_q?$m5(S3pRUL+>OwL*9lrzL<&K2Lr* zh6X_@r-EuAE2NmeK>`=1Z_2aCw8%vE4UgPUOu-1RBdgN~b)pfhrT6Ogo8(_H=f|5- zfOQ)E8xpsyjD^6dEM*Mi^D%{_1_o28f*dQRkWUyA=}iPUTSEBIv3$Ye3vJ>RUcpEn&>HJIwlS1r($$YGI zgMvvFdZ?u(Ve;Wazw?)^hA9;IPn$l$3DyI}>^H5x5aBS=@0*dJNrAT{@s-TdtkOF# zU7b93cd^KZy()OEyxbI*A3M`Lami8u>YS=BdPS_cT~LWli|O-A{CcOUUR~ym#}=dR zh0!IwabfTVF$sWD>!vSQJ>G9C+23?2p>?2*(Is7lBlE{TK11*sZFwL2=72!H+36d~ zh;S&>-KX?e0-?ppb*dWHb`XF-)!5=5zjG<9NQ}3qt#ECAR_71BsmDzr;43{_@(U<( ziPs`$I2E^=D$@H?RpYGYvW}iL8;*3aNmodg_n!SdUpH6>FoJUUuVrapp zxb)6zFLmUMHk>K9ZX=6Q`?F`T20g$zl$?zK24ePDID-VrC;tXYq?m=`;mb-TtvbC*rW)mEIkpE9;>#=n8sKmw1_QX$AQo) zNw*(-MR~YMsVAg4Ad7~eL$2c20jOYYn0=u8JpCU58YZfbnD&mq>4*OkjLriKF@~V?>RmU`2#uYY_j4m_ zDlmt$8HxppJn{CRJ3PsOpuAh{^&Yb*M~ao+^t4Qe`@N;j*->l-%^OcVFv|@lh)Je( z(gWHYifI#CLfcLK)7XAm))FIR_y|8}yQC$eR6;PfeB4`C%Ua@attM(MX^C8GSxZEz zWP#Ww;{@Q-<~=vINZ>H?2%J+cZ6T1++Kb|Sk{=r>ndCfYaNXX7KKY1 z)3}hvl)hA)k2NO0yT!!xz2nSEB0cJ1CoB%mAZuHeSLHt{+mqT$n*Bj%dz47yKh&>a znVqE1$T%H(My3yMBmd4WMzc@aO2I0UZUFt@d?e|=>JObAS7$rx7L zc5=iAS>_cQK=3*qc;q>CwNSS2f`}^$842+%QK(Q5`S4umYFcKrV>QQ;2jTQWzQHg0 z*0s0!FxkHmGUNLmq2;7r1g&f6pRL&sYf!dI`6Xd4U}Q#R)^5yMD#mTCA=6E?u%%fl zQG3Wf3$2)2kSlx8Fe6>)s8~OH@Mei)VBY)+tj)~R!I))ki_#$<9glaH?6bqQny9rj z^Kz|aZgZ))jSy~D_To0(#Eoz;OW1;K%iskr&Fpk^FhyX<%$iwCD=`VcMbTbpLIyf| zt-aDbGB3Qq6YY7XMOo#`ji%G5CP%3_kttgNa_&?Zb+D<)TIw^jV93u9Gr(GD zg28dYy%Ns;xnP^)4=Tkrf&=<7 z_AymBf1>y)Ee8EMyLDz{EtH-%wj}$3JB-CZmTlj|3nfOIjYZ=gaQQRFR0Og^izLco zktA$$vzBeeTg4@?S`^t@yj2Cd!nTrCxOx_9c>N?}5e=RpgHMrqV@_OI9+-*xy*v{Y ztYJUvlH8Bd<(cSrmuBMOT213xOEWRoTAqn6^)NLPv05$nj~=gx9h%Z!919)si%n{| z9GqsfGe3TLv%iOrg;8fj3TJczvUJ@HA0%(a_=RjL(SjhJUS0Yf5_wi6ZUSk7+E8;R zEq9Y-QJ4u&K6jSP6Ig9)3VUJ=mS&O?F@?7qKhqjQQ+Ru@G{cD9)|(yE9=S9_HV3MV zE=F^FXQL?5bwyDYF$^>qDk3&Fp7spO!vT|0ct?$@H_mm4UMvoSYg9Y^sCbugao_5p zaRH%39>ZNS&SfUbGAD06MpJv`E(A4NTT`%_{dO1(<_C-aM7gLIGKF@5I>>uH?+Ajt zaTM)z7^EEmejQzVm4WDs{ikTA?k-aR37O@vqdUOO(KL_3(^i|-r+*SAL2u|_Yg2AH zib;+5r7bXhwHa`T|Jea*FI*|+UUV|4?q|0O8^+UWeKGn9R>z@X&zjb5{%FA_reL-M zhnBu3yTrd{J43N`_7w!>F{qeqUKoDPEJ!!km{Fax;|Qe)P}eb|;KYPwFlAH00*EV# zvh!ekHd&$LG&Vk@|7>eQy3d$5lfl7iAq)<-`6!~=mDewk?`ZcLbq}Dm!Y}$UwJv9$ z4Hd8I45rM^POkpOh>PR<#d*~)&NV4)n75yP)5Qzv0J!8`BFyDMX^YpDC)eOIYILS0 zNgaX%H0$JNjn{3d%77fFC7it3##|cc%3cNyi+o(*-8o zuk9md$Lxv-Aa}G7gYk#yhiTd}US09t<&tA_ zblZ{>2qQ-;lS7_wi|6r?=5Knuf~wXttak>EP3f7@5>-d5sVdpcPS+CuJ9Ib9{vTQ%7T z)wDM2X*SjjzYhPi85WvozB1Ve*IVIzrZf}?S+bJ%IgW+%Rz28!$u#Q-!3+k05c*wa zU8~cr#+Z;|jc=U%#c;)GzmlvF@B27X1@R95X{sgn2)gq@_GA=>gJ%P82OkIABb7os z5bntn67G>o2c{?lXJQYmMVl6C#9KVHgL_1QPyQy%+TDVCq@R-9<7JCda zO8)g^( z(Jus$mI`!^j}L0W!H5?Q9w2qlqkQ8G1wV!rC}CCVGEq@J73sS}o;XNtSx0BQevnX_ z@N;*3`1N>ArX9rPM=u`BK#al4K-5P!&`nCgf1oh{fTg?PVWY+jUg$z(Z4}3_86v_) zOY!i`S}yTJo6HDiH;~3b$`@@`c_Sb9smQ^aB~j(Gq6$4Gkks!(5emUJsTGWRVtz5+ zkzo+hn))pGjUXpuB4&>eOINI!63LZEiX{&8gPf2Ms@mUaG%&U&e zmJ~ zmpn&@YcGT)Um*V4hybjZGY;($wxM`@A#2f+R}oj1m1!exED=`)}y(L(p89REwn7P=>f zBF=!4m%xX0yJv=EIcGul3@yk?{6OM`{FG;G6o46fP+?s2jHJ6RMind7dUkcrNnFEz z!{8*S%zC+fwGGj2j{7WEJA@HP^2~puJ6j> zx5#J^i6XjkcrB$dNL=4N(G>4G&F9hG>5$dC>h55eIHP;wE|yund&VHy6!zKloSq{; zlf@;UFeIK>)1?DA8L2Fcgm=qMz6$NUL4uXEFi;o;qS{$j)*P)05onO36x37PgjV8i z4NedN=7I4!Nw}4ge;W=k!F!2AHilu^71^X)aMOm4zGqzZLdjWfCMnAeCsWuZ(fnzZ zNn(<-+(bFpi!3*joaH9U!ClI7Gl|paEbHS*PaY7o-AkfTNTNxXa$usG)+zh%7 z@<585OJ93BI~OBz_z5oI4rI2?#EgDu{&9+qPCtYz}XbPdHwZ^et4p;Ea_ zVN~u=bo~+XoC92gqf(1nGZ-rmh{jFv@_E(1(#mB>nls!YksljR6S&XW^M zKQCn;2o0Em5+IT*LY&_ef@4>UkAzfw5u2E8kr zHhN*(*nv(_FuEySmb+tX!mynEyrk>?wB5rlHu% zrjyKpVk}wm%DU84^|btJY(su*JlgO9PfwU~#e`|!tf|n+25uND+CTh07cq~BlhmDK zNPv7=+D5Iq<0Vd_WQ&#BB(IeO_)OwUW zqCA;(54f*c4>%O>2O~Xj35VicQa-4p&=@?AdUsTnnW}3)F51sz{u{ z*%}r}ak5?4(=-L}NP&i_>2L;}^#`L2x<+flh@1J?JDz9;GX)1uHG#Hl)}w7&A|cXp zl=J}!;WP^@#0Ce$x5ZNdmhQAvoGw|S=ezZ3{v9>ju=uW^u*_v#Nhm0XH?xD2$RmWp z781b5Ieb7$Zm#ro5e_v81yT@caul4>UOS&mg^^x$wfXE!IX}i69eb$9^4U|a`St12 zEgydc{Yw9!eBoQkXaKTGnA%b#IN0brvGi889hcbgQhuf3@_~dx9p3XAsT(cT{=ImZU zC;+=2Mjy#1ile?`bPCMq=|RuvegLD7I!1R1j84KTyyA(`#pV<8mjFTLXekr_#qk@)sJMPz_$?J0gA97^CSh^X?|*B?k!1I~_3Z3?AK$qKOdBw7sy5%fI`d9@=7rsR z=FR1adEKRM%og(+p3J;HYu+f8JI9i@GxO>M^IA9S+4DL)>pfqo6- zZ%-mnIV2Iec~+5VMVm6XHUluZnYApR{`{!c38F6W{;osuC3L)eut<=knel6v5cGXo zkSZ0w@yX@ll%yEWc&j+WPH=@+p`ew4e{{*)fGAH;C|LtR89gVWFNaumLA=W&>`Z)7 z=SbSxH^-*2n#0P#Z-E+)tjM{;;Y$eyinPsKMi<-ic#QGb&z_X|220iL#cyX2GBoP; zV7yl8QN--mtSqc? zSW9tkRY|zwn2{EyP~B++ltpNyEL7~VoW}~JP&e+4wAz(v$f_1G(~Ojx$Voi7m55^9 ztw)|C3KzR*Bc79&pm0)x?WTN)WKPGp0OHtu52bmNmBUS>Mxy%u{8@nEb61rN52bl} zmdqJWdpb2lSGqGluH;BOy@duy21OFce<`w(Lg^On(jcc0|8U90{^BJ6%x{rxApLhM z&KByY+WNr_8S$!qoE-e1^W##c$0gQoRhH44g(c@N+n66;?w6OTU#qX0*I2aaHFOz5 z7k>UC*#*rPp+uN!U(}40rVj1!Q1eB4jRK{loFBI=f{gHx)XmN}D zI2vRsJ?_#IlxlvQXl{*Zg5UR+hWK(C<;7C4BMR*w*Bg|Mnp@6NXV^HP$ItoAjLtp? zWuyWR;PPM(VCGiALYG45zABwel}Ti)_x7dc1+MnoP~jq?5~Zh1OzK3M8p|Rto05ddd8YhvYZcWg&ITDj{_( zW=%p$xa$X!=N!!^QM+Oco^GGp7`o}!&71>c7>e2J7y;>)_R%N03lG(Dlh%GrI<5V* z;@QVyv`lF2fWhQx>JvES5PFD>b-X})W1V1|QXrB7k0^?4 zsIz=|uN{EgV|30lMu{HrZgQ#5qwQyK&y?pP>z!7fJC|`BERJ1bMSQH;xNzwqQaUyj zc@!S?6@xc4J3x=A9!1K21=8BrUO-czm*n($mMJdb#U3sb6op)(LT*xWWYQI0XvDgk z4=j$KSlp6gZV=12a&6QYwS0oNPb{9*=>1zm@}abnjy{Q4s}X43dqlDf2Z3LJp{3z+ zAC!kniGv&QG#wlnwD8DoZB7C`OBpGbLD#7Dt}9j-LYr{s=5A)-CwL2WZLv*qqh!mv2@AAKP-D5;@Cp ze6oVZ=PZ9DmlA`(s*~P!_E3EF~{e6YiEqt)Auo{M6=_{=6;@A2Lt6TU`Utu*2zkRI=AMY!y zhT#wT3ah*LfBFimf&5foVRaXO+E-ZJ#j8*|iKA9`@kC!?bqlZUE5OYwIO=tMh1Fer zM_*y}D89R|u)2ls=_{;m;q`rm)h#^PS6DrYxAhfPnp78;(zRjxw?n@y63Aq`10=g>i7TFHJ<i!?@p093S8ZE^0>i4;@J3U|dzLf})U3!F_yN6KwCHifDE@i^j zGfKXd;=_M{gNBoo=u}#!Jsv5uEc}_za@>m^}?ZaGu z#Dm#>`!E+y<*UF{Il_Z+P1!cXeqsj`e~6VM*L&Kg+k^{jstBJ*ktx>_2v>d>BAz{jhd_WzWgWSZbFL0xF7O zp))*?k>V-W;1V|iQ0v&P!yDdK^v#_ucq$p!RfccaXt1aDewXEkEk8(0@8zR{=o~k9 zDNZBILtK()0pMTBV|{BM0V~M*A-iL+3Iw8ELWJ-uex3e&#XWVw3Xt4igl>9#>>TU0 zb~6BgRl&dZMR}@&9l*m+`qxTR=vIW3apDY$e{Wuc<;ht;VRv_O7B_iJ4kxf#ceKG| zh;aGXX zduzrbKOfZspoWUVqC???!+?$_*x3jnXq+Sh5&{dIA*Kl*@DcGKVX8;0?HFm5gi$JE zyYl7Yc)bmV$2~0)$<~<_+K?L$=|QZ-d2quXt1{doe1jfi(}R2sgmwTtRNqMS7}J7d zv_TF;3XpYHYH18qGSSwS=mVcC#6o1+NCHC1m3>zE@ciHcQ`ng){!T45XFse7;5egy zR&{~Ok{CS$cT>lR?s1$XOhjlH)3JJG1qrg;GXNjPw&YZgXMRyGSG<4YcSt%XOY03?(O5~ATzm6*C-VY!{RS|qO+8v2N!Ep zHg|UH%*~=!C*#@M?J?5PbGFs-3n?;tE>A`;0pGk${3)x&GVW$_*2Iw(rRp^PG-XpL z2Tnz9*d6i-7sQqkbD*jVhk#pF6^pg6(AgK?j-YAF{FjbVE#-`k1X)t$sXAwGVZ~+= zZ#k6=0?8JDYSEO$V|wh6BXh1>NE`bCpyv*7?QjMUq%T!c^Ofe3ldpl zv=b1eRzzkR!6m6du3=kRekN?0T4<{LkopN*t_Qv}Qn0KKHNtaaiKbLU0Uvm^f}C;a+g{zaf}mc9;RC)Y#Rq;4^T(0eK7#FgIwKFGeZ@60QiUhDi_~Jaliq z9EVAHAC?&r&RjO`&R{29&MhYzq-d+JlXFT^U;VV-`)uJye~5e1BLy&RXawwQX57aG z$&UIol7svM1h--tBbA8XKnroHK-HE!NX(Mw59UDT7*)Zf6eNiv`DNizF9%(W?+qi@ zEeaHvOi1th(<{@q;##mFBNPz808klm38mrYx=Zd)YH0?auw`G}VsgI_s8o%UpjaA! zDHfzh_|aLyvJT$~-^$s1-}ag@Ejc8_OWMd<#Ju5kQ$R1St9qJrnqg3G$WiFI5kTg-Ybx;L? zKn8cP zVBLsPDrE$Ek1F91ARvzPwm9P;qJorj&kf;a?62AvA@$z$!&;h!|90Zp#3BX39C||9 zgjpfuis5RGO?)ppV=*&VnVC1Vwn49?*Tm7(6_v^$mL0@|O3gPsQ=-8@SZYZ$Wm@Pt z?^*)IyDE$*arBH@PEwrsKD|PdSaYN%r%i200E8z=75#GpgIYXuoH;=fuA-q}sUbns zUDu#Mq3RF?%p+CBI$eg$P;ay~o7g;Y=VhG5pY zZ>ju130{T)j0hpMXUYf`s~<%W=jtIrVYTV+O}O0{RICWvyDi&D&^S_oq+YtZHbh`zDOO(5L`2QX5MlWde*zj1;6V!0Y#2ztGPT1H zVSZx1jG5`_33DgF#TkJ3gDv|CQw>C=<;jd*14;l$Ix)jXB#Qo^f6m+3HxBB#O*VLVo7we1i@H9M1n zM)%bd>`YLtWxTJe!JUGhHQHq6fG=N1$&`d+WSOWIP)3~Kf1|F&Tw>;k6^FNuU6eyb zC68-p(+icCd_uV@--FMlXz#X(G&07$jBS7UEgyIbZW9x^J^s+_2drRt;Vx!f-EKV; z+m_F*?xGzpP)D=3=Q{TYAoK3s8lEsrEnHUWfK|Lc)D+)wnQT1-_5eE~0{I3NymSyo zxGG*Dhv*_)O`laXCYWTp>Z>`UV{ zcxv4PmEpoO;7bj$Y&pvV`!aE?uneP+|L89CD!00vKMUL>=xr6@)&9<#FLth6jp&pn zgkWaGvTn`%)|M1wjf9X02vsxk0h@I9B&;(Zk#|s+X}}~CSj&GB=3au5ELnUSLBPax z0V>W8u1O25ji#Hlp+B0OoD{%OY`BWWmMT8R+19eEm|R+PVMsmNeoE|cPJF8h@Q8VA z)J}Bzy?yuVF7`uZ9HTk*5(nPU+ z8g6=)%yqaZu_2wDl;B1Oa2ngF0VAHZAd%n4E%6qyZ2&W-oLUxq`&@OYIwxD$Nx2f^ zhfIZNYXO?Ey8*>^qgB7oGb)WSysbB-W$3uDLX9dT$rAkch;tEC zC@m!Rx#`Epm9ET%%(3$#IbE>_vsmM9UU0O=%^02>dh9}qaBn6l0X(cy=ysvFTl&G; zp-8&Ia)3wWVwxW@Uvy~)s#0}?y?xcAOVkM014{!R=VSV1g+i0y*tU2f$@*^Mhnxcb zu~#9SlDJj^$b#QOOW=BI&eZnJt41!q&{yue7E>NX>Sz#%w6X|9>Rn6=>}(6J3rZ?q0;Q9q(C{fnJ7MD5Vk5nFcx=xTD>&u z-tVEhX3Ft}QAA>)v)TgDXj-2=z{ZAr4dBYZid6Q(45N7VDG4hLk)|5U%;|NzBMb2qkW?Y|c#>gmwE7^c)MiNy#>t>-2KBVb^3I#5jzgtn9 z;LtWyOH;6zs{LRD^jWOjEv}LyOO+ONSk3r(F#nHu0siX@=@?8{(=r4lvRIDa+f+So zeNPE*F{UR!cF~7n0=C;ix0JJwUWA-!%IQ)2!3a;2>S4?=^Vk}SKC3zGVkyn|xKxY! zu+>X=(W)v{0}Mu=pWc1=>FnpkMC`~<|5HimAFaH509_=QG=QG4G`23PVGjn~$k?yw zg%3C}0fwo#4IEPN(AoB`hxmO*?3RpY@5l!Aaf~v;Bu#e~-GY!j&JZ@Ybqw`=5nq{~bOze$mkx*|`!+G6mm^5h)G5}W-_9?oFH5vMuODmeF5B+Z zS80$MZyjgOASs4`3}l(wTE%PWs)o_JF{?3R58KGpl#OiXyf<$VCD>67XB`ECcgZk1 zF}=`OG4Q4y#!Tom2fZQ9V;pxDcSU!MHbIDCAICnQ8H7xPA%yi+AoR)_)ZJc+=vphxV#4xSDM%1n*CRDwWL2i|#vQ3V{+k3}kgKmvI4 zTO?!2GIU82@n)K$bw5WfLVt@A{ef6PFyqvwlWeYWC`v z@D5T*6JJB{97(?yr9joXRoFBtxp~L4S`so%lQlQ=@T;5kbcXyQ6r27}W!y^N;o_Mi zclvh@ws}qbV#MeGLNWXGL^dHd5&<9_93@JW-btr zsA^AlO5Qhk8zS^2r&5}n6S*V@r}dK2RFq-(iNC2Sx`tT&C5_#ouDXJ2?|McG^}?J z%w_l~#aL_Phsc7Wl%S9WopeQFF|9xbRGVhBkZjOqNvMqLHBwp#9m?~o7-iAEzc+1w zghQ#7*#I?93^MfR2r5_2t+OoVMMjTF@Dfx%UISC1`^|kNHm&pXr5{`k;ok~WoI7cc zd}R@e87rKc#nikUw4dtBWdpvkauQb5&{xZZ;Pa(?e6-ky73*U9+xWVa_s8KD9$MBA zleWMCeg>^BSpa}{V;5=0(=u~E&yOLVO#hq zAYdrtWGQOItliCh>GzV16QB3o$k;oX#tKQ|^5IwGmHk>2+4NVcy7KXQuq}Q8O=N3? z5%Ej_AD4W7`}=`{Z~1AD{fj{HyV;psQ=Xf;YDZZ}M|jKhtEZ zUxulxLowh@{_u0L*Y2y3b$-O<56{DogvUbuHOX@4LIK$LmJ~c51MCYM!u4sFc{mPl zkPTg<&bfZtymNbvs{fn5HrTB|otmrB4!s6Wcu|1x@owgq()+e3@G`yl;{5R zEo*i8820ZsqUONmq{C$;Tvi!-2XHx&vnJzmx#lY{-oa(}CO^St^@`A-Kq`h@tOJGI zK>S{R*@C@P0lzli_A6{}sF%QDhPOoTLBXKl$N*O5e) zr$5<*L5}E^)F9_V?hm<`E7F6_#KpE<1qXaVb80p=Ju!^f?kqFyodq8peOZCj_Dj>( ztk*;~Gh3e{`B=2gQks!aHF;MCv7VE!edIeYvejTRDHVfTig>twFTI#ME!UuTK*nfP2j=k;pbDEnhx!>^05i znT^+6Y^G;Q{@wWR%j!%iT@y(hIK5iP4P4^`nSDSgVptRNBiuVg4_@bt9)?V;1<_|X z#^Vo?SXzIvO;#Im%`OCKy-&Ksj?{dIkuJd+r5S(Q)*tyDMKfwe7et6{toioA7E*_Z z7w>a%&{Tv2ve}@ql_+wBIeWERoGadLIgZ@*<;^tcM{=prqhZ;Db4`;C0+yhb`WRB# zizw;-jimdNrv#6Q3dw|UlM5B+euI|89{_d+0m zZ}FJc-kt^3X(=uCpHz}ggBYu-w4(L;2PXVXh7<)vof4 zxurR2-o{!UX~vG}tL|{Us=l<_h*|_fFkw<%UX?dcO)Ut{bRz>9y;^96xN@~LnPuT5 zH?~8;SN0Ddd+x?NbjwT8aT=+#(5g3GOY3YFliEF>>&qef zcX)J-wGH(C58^FHgarM6Rllb{zf*0Y)SeS6jm%l2;B$%5hKgF)S9tj!K8H}?%hzCi z^LZLQ%g1Lw`;*0es7<~VFH%fkdtr7zR*Rn0FPfue`LcUX|GaR%rC;PE`0TS^h;*#j zOKzWkpHiu*ufu=9#szOf$^N4K`K};RM-qSA81QP*0~fAD4tSEZx`4e zR>;R`mf?z6c z1?QtFPkjs!`Kr(nY4=}NZCT-`s2nj!8j#We?8@|)I}2X|BLp4#sDf3RT|o@9>0@2f zyS5=sw;LpV)R@Y*VrN`zNc@-vlwe2$Sw|3RJ6QwK!psIZ^JMl+2Vj*``;`JfhtKO+wh0-BIzwDCLGv`tzAreg^D!zX zWL^|@E~nWgU_Lfi3RVVt?2__rG_!fvIzybC3dg>} z@rm^*<68EWhCfT*^yb*W^CSUwYI{TnM!z6no(fUpgA{-;tW|B?#dA

cws;1%f&< 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

chT!2~Bxtx361J_r7}x>K>uXqDF$+qUH!e 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 literal 0 HcmV?d00001 diff --git a/assets/cf-mw-auth/src/services/fixtures/advanced_policy_test.rego b/assets/cf-mw-auth/src/services/fixtures/advanced_policy_test.rego new file mode 100644 index 0000000..e264e86 --- /dev/null +++ b/assets/cf-mw-auth/src/services/fixtures/advanced_policy_test.rego @@ -0,0 +1,179 @@ +package urlrewriter + +import future.keywords.contains +import future.keywords.every +import future.keywords.if +import future.keywords.in + +rules = [ + { + # /product/:productId/:productSerial + "match_uri_parts": ["product"], + "match_qs_keys": ["productId", "productSerial"], + "rewrite_base_path": "/product/index.html", + }, + { + # /product/:productId + "match_uri_parts": ["product"], + "match_qs_keys": ["productId"], + "rewrite_base_path": "/product/index.html", + }, + { + # /profile/:displayName + "match_uri_parts": ["profile"], + "match_qs_keys": ["displayName"], + "rewrite_base_path": "/profile/index.html", + }, + { + # /wallet/:tab + "match_uri_parts": ["wallet"], + "match_qs_keys": ["tab"], + "rewrite_base_path": "/wallet/index.html", + }, + { + # /withdrawal/:productId/:productSerial + "match_uri_parts": ["withdrawal"], + "match_qs_keys": ["productId", "productSerial"], + "rewrite_base_path": "/withdrawal/index.html", + }, + { + # /withdrawal/:productId + "match_uri_parts": ["withdrawal"], + "match_qs_keys": ["productId"], + "rewrite_base_path": "/product/index.html", # intended + }, + { + # /drops/:dropId + "match_uri_parts": ["drops"], + "match_qs_keys": ["dropId"], + "rewrite_base_path": "/drops/index.html", + }, + { + # /pack-open/:productId/:productSerial + "match_uri_parts": ["pack-open"], + "match_qs_keys": ["productId", "productSerial"], + "rewrite_base_path": "/pack-open/index.html", + }, + { + # /challenge/:challengeId + "match_uri_parts": ["challenge"], + "match_qs_keys": ["challengeId"], + "rewrite_base_path": "/challenge/index.html", + }, + { + # /claim/:claimCodeId + "match_uri_parts": ["claim"], + "match_qs_keys": ["claimCodeId"], + "rewrite_base_path": "/claim/index.html", + }, +] + +REGXP_NAMED_UUID := "^[a-zA-Z0-9-_]*-([a-zA-Z0-9-]{36})$" + +REGXP_FILE_WITH_EXTENSION := ".html$" + +DEFAULT_RESULT := { + "uri": input.uri, + "querystring": input.querystring, + "action": "FORWARD", +} + +hasFileExtension(uri_parts) if { + last_path_part = uri_parts[count(uri_parts) - 1] + regex.match(REGXP_FILE_WITH_EXTENSION, last_path_part) +} + +rewrite_that_match_rules contains output if { + not hasFileExtension(input.uri_parts) + + # check input against each rule + some rule in rules + rule.match_uri_parts[rule_uri_part_index] == input.uri_parts[rule_uri_part_index] + count(input.uri_parts) == count(rule.match_uri_parts) + count(rule.match_qs_keys) + + rewrite_qs_keyvalues := array.concat( + # parse uuid out of named id within the first param + array.concat( + [x | + x := sprintf("%v=%v", [rule.match_qs_keys[0], regex.find_all_string_submatch_n(REGXP_NAMED_UUID, input.uri_parts[1], -1)[0][1]]) + ], + [x | + not regex.match(REGXP_NAMED_UUID, input.uri_parts[1]) + x := sprintf("%v=%v", [rule.match_qs_keys[0], input.uri_parts[1]]) + ], + ), + # pair param key with value skipping the first param + [x | + some match_param_index, _ in rule.match_qs_keys + match_param_index != 0 + x := sprintf("%v=%v", [rule.match_qs_keys[match_param_index], input.uri_parts[match_param_index + 1]]) + ], + ) + + output := { + "uri": rule.rewrite_base_path, + "querystring": trim_prefix(concat("&", array.concat([input.querystring], rewrite_qs_keyvalues)), "&"), + "action": "FORWARD", + } +} + +rewrite_path_with_index_suffix contains output if { + not hasFileExtension(input.uri_parts) + regex.match("/$", input.uri) + + output := { + "uri": sprintf("/%v/index.html", [concat("/", input.uri_parts)]), + "querystring": trim_prefix(input.querystring, "&"), + "action": "FORWARD", + } +} + +redirect_path_without_trailing_slash contains output if { + not hasFileExtension(input.uri_parts) + not regex.match("/$", input.uri) + + output := { + "uri": sprintf("/%v/", [concat("/", input.uri_parts)]), + "querystring": trim_prefix(input.querystring, "&"), + "action": "REDIRECT_301", + } +} + +# finalize result (only first item is used if items in 'result' array) +result := array.concat( + [x | some x in rewrite_that_match_rules], + array.concat( + [x | some x in (rewrite_path_with_index_suffix | redirect_path_without_trailing_slash)], + [DEFAULT_RESULT], + ), +) + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "challengeId=ce792c7e-3b2f-42c9-975a-5aa4d28bf845", + "uri": "/challenge/index.html", + "action": "FORWARD", + } +} + +test_claim_path if { + request := gen_request("/claim/", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "", + "uri": "/claim/index.html", + "action": "FORWARD", + } +} + +test_claim_path_with_id if { + request := gen_request("/claim/AB-CD-12-34", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "claimCodeId=AB-CD-12-34", + "uri": "/claim/index.html", + "action": "FORWARD", + } +} diff --git a/assets/cf-mw-auth/src/services/parse-auth.test.ts b/assets/cf-mw-auth/src/services/parse-auth.test.ts new file mode 100644 index 0000000..7614feb --- /dev/null +++ b/assets/cf-mw-auth/src/services/parse-auth.test.ts @@ -0,0 +1,143 @@ +import { CloudFrontRequestResult, CloudFrontResultResponse } from 'aws-lambda'; +import axios from 'axios'; +import AxiosMockAdapter from 'axios-mock-adapter'; +import { AppAuthServiceConfig, AppConfig, AppConfigSource } from '../commons/config'; +import { decodeBase64, encodeBase64 } from '../commons/utils'; +import { ICrypter } from '../crypto/types'; +import { ParseAuthService } from './parse-auth'; +import { fixtures } from '../fixtures'; + +describe('ParseAuthService', () => { + let mAppAuthServiceConfig: AppAuthServiceConfig; + let mCookieTokens: { access: string, id: string, refresh: string }; + let mUserId: string; + + beforeEach(() => { + mCookieTokens = fixtures.mockCookieTokens; + + mUserId = fixtures.mockUserId; + + mAppAuthServiceConfig = fixtures.mockAppAuthServiceConfig; + }); + + it('should redirect if authorization code and state inputs are valid', async () => { + const config = new AppConfig(); + let error: unknown; + let request = { + 'clientIp': '127.0.0.1', + 'headers': { + 'host': [{ + 'key': 'Host', + 'value': 'example.com', + }], + }, + 'method': 'GET', + 'querystring': 'code=eddf2e65-a755-44d1-9a8b-e1f15f7c6c4e&state=eyJyZWRpcmVjdGVkRnJvbVVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZm9vIn0K', + 'uri': '/_edge/auth/signin', + }; + let response: CloudFrontRequestResult; + const crypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + hash: jest.fn().mockImplementation((data) => '1234567890123456'), + generate: jest.fn().mockImplementation(() => '1234567890123456'), + } as ICrypter; + const decoder = { + verify: jest.fn().mockResolvedValue({}), + decodeIdToken: jest.fn().mockResolvedValue({ + 'cognito:username': mUserId, + }), + } as any; + + const mockAxios = new AxiosMockAdapter(axios); + mockAxios.onPost('https://test.auth.us-east-1.amazoncognito.com/oauth2/token').reply(200, { + 'access_token': mCookieTokens.access, + 'id_token': mCookieTokens.id, + 'refresh_token': mCookieTokens.refresh, + }, { 'content-type': 'application/json' }); + + try { + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + const service = new ParseAuthService({ config, crypter, decoder }); + response = await service.handle(request); + } catch (err: unknown) { + error = err; + } + + expect.hasAssertions(); + expect(error).toBeUndefined(); + expect((response as CloudFrontResultResponse)?.status).toBe('307'); + expect((response as CloudFrontResultResponse)?.headers?.location?.[0]).toStrictEqual({ 'key': 'location', 'value': 'https://example.com/foo' }); + expect((response as CloudFrontResultResponse)?.headers?.['set-cookie']).toContainEqual({ + 'key': 'set-cookie', 'value': `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.LastAuthUser=${mUserId}; Path=/; Secure; SameSite=Lax`, + }); + expect((response as CloudFrontResultResponse)?.headers?.['set-cookie']).toContainEqual({ + 'key': 'set-cookie', 'value': `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.accessToken=${mCookieTokens.access}; Path=/; Secure; SameSite=Lax`, + }); + expect((response as CloudFrontResultResponse)?.headers?.['set-cookie']).toContainEqual({ + 'key': 'set-cookie', 'value': `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.idToken=${mCookieTokens.id}; Path=/; Secure; SameSite=Lax`, + }); + expect((response as CloudFrontResultResponse)?.headers?.['set-cookie']).toContainEqual({ + 'key': 'set-cookie', 'value': `CognitoIdentityServiceProvider.${mAppAuthServiceConfig.cognitoIdpClientId}.${mUserId}.refreshToken=${mCookieTokens.refresh}; Path=/; Secure; SameSite=Lax`, + }); + }); + + it('should redirect if authorization code and state inputs are valid', async () => { + const config = new AppConfig(); + let error: unknown; + let request = { + 'clientIp': '127.0.0.1', + 'headers': { + 'host': [{ + 'key': 'Host', + 'value': 'example.com', + }], + }, + 'method': 'GET', + 'querystring': '', + 'uri': '/_edge/auth/signin', + }; + let response: CloudFrontRequestResult; + const crypter = { + encrypt: jest.fn().mockImplementation((data) => encodeBase64(data)), + decrypt: jest.fn().mockImplementation((data) => decodeBase64(data)), + hash: jest.fn().mockImplementation((data) => '1234567890123456'), + generate: jest.fn().mockImplementation(() => '1234567890123456'), + } as ICrypter; + const decoder = { + verify: jest.fn().mockResolvedValue({}), + decodeIdToken: jest.fn().mockResolvedValue({ + 'cognito:username': mUserId, + }), + } as any; + + const mockAxios = new AxiosMockAdapter(axios); + mockAxios.onPost('https://test.auth.us-east-1.amazoncognito.com/oauth2/token').reply(403, { + }, { 'content-type': 'application/json' }); + + try { + await config.update(AppConfigSource.STATIC, mAppAuthServiceConfig); + const service = new ParseAuthService({ config, crypter, decoder }); + response = await service.handle(request); + } catch (err: unknown) { + error = err; + } + + expect.hasAssertions(); + expect(error).toBeUndefined(); + expect(response).toStrictEqual({ + status: '307', + statusDescription: 'Temporary Redirect', + headers: { + location: [{ + key: 'location', + value: `https://${mAppAuthServiceConfig.cognitoIdpDomain}/oauth2/authorize?client_id=${mAppAuthServiceConfig.cognitoIdpClientId}&redirect_uri=https%3A%2F%2Fexample.com%2F_edge%2Fauth%2Fsignin&response_type=code&scope=phone%20email%20profile%20openid&state=eyJyZWRpcmVjdGVkRnJvbVVybCI6Ii8iLCJwa2NlQ29kZVZlcmlmaWVyIjoiMTIzNDU2Nzg5MDEyMzQ1NiIsInBrY2VDb2RlQ2hhbGxlbmdlIjoiMTIzNDU2Nzg5MDEyMzQ1NiJ9&code_challenge_method=S256&code_challenge=1234567890123456`, + }], + }, + }); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-auth/src/services/parse-auth.ts b/assets/cf-mw-auth/src/services/parse-auth.ts new file mode 100644 index 0000000..b971be2 --- /dev/null +++ b/assets/cf-mw-auth/src/services/parse-auth.ts @@ -0,0 +1,100 @@ +import { serialize as cookieSerialize } from 'cookie'; +import { logger } from '../commons/logger'; +import { encodeBase64 } from '../commons/utils'; +import { BaseAuth } from './bases/base-auth'; +import type { RequestOptions } from 'https'; +import type { CloudFrontRequest, CloudFrontRequestResult } from 'aws-lambda'; +import type { IAuthOptions } from './bases/base-auth'; + +export interface AppCognitoPkceData { + pkceCodeVerifier: string; + pkceCodeChallenge: string; +} + +export interface IParseAuthOptions extends IAuthOptions { } + +export class ParseAuthService extends BaseAuth { + constructor(opt: IParseAuthOptions) { + super(opt); + logger.debug('parse-auth service initalized'); + } + + public readonly handle = async (event: CloudFrontRequest): Promise => { + const request = this._parseRequest(event); + + // if code is missing, request didn't come from cognito so send to login + if (typeof request.querystring.code !== 'string') + return this._respondWithLoginRedirect({ request }); + + const state = await this._decryptState(String(request.querystring.state || '')); + const userTokens = await this._sendCognitoTokenRequest(request.host, request.querystring.code, state as AppCognitoPkceData); + const cognitoAmplifyCookies = await this._generateCognitoAmplifyCookies(userTokens); + + return this._respondWithRedirect({ + response: { + location: state.redirectedFromUrl, + cookies: cognitoAmplifyCookies, + }, + request, + }); + }; + + private readonly _generateCognitoAmplifyCookies = async (tokenData: Record) => { + const idTokenData = await this._decoder.decodeIdToken(tokenData.id_token); + const cognitoUserId = idTokenData['cognito:username']; + const cognitoCookieKeyPrefix = `CognitoIdentityServiceProvider.${this._config.cognitoIdpClientId}`; + const cognitoCookieUserKeyPrefix = `${cognitoCookieKeyPrefix}.${cognitoUserId}`; + return [ + cookieSerialize('amplify-signin-with-hostedUI', 'true', { + path: '/', + sameSite: 'lax', + secure: true, + }), + cookieSerialize(`${cognitoCookieKeyPrefix}.LastAuthUser`, cognitoUserId, { + path: '/', + sameSite: 'lax', + secure: true, + }), + cookieSerialize(`${cognitoCookieUserKeyPrefix}.accessToken`, tokenData.access_token, { + path: '/', + sameSite: 'lax', + secure: true, + }), + cookieSerialize(`${cognitoCookieUserKeyPrefix}.idToken`, tokenData.id_token, { + path: '/', + sameSite: 'lax', + secure: true, + }), + cookieSerialize(`${cognitoCookieUserKeyPrefix}.refreshToken`, tokenData.refresh_token, { + path: '/', + secure: true, + sameSite: 'lax', + }), + cookieSerialize(`${cognitoCookieUserKeyPrefix}.tokenScopesString`, this._config.cognitoIdpClientScopes.join(' '), { + path: '/', + sameSite: 'lax', + secure: true, + }), + ]; + }; + + private readonly _sendCognitoTokenRequest = async (domain: string, code: string, pkceData: AppCognitoPkceData) => { + const url = `https://${this._config.cognitoIdpDomain}/oauth2/token`; + const requestConfig: RequestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': `Basic ${encodeBase64(`${this._config.cognitoIdpClientId}:${this._config.cognitoIdpClientSecret}`)}`, + }, + }; + const data = { + grant_type: 'authorization_code', + client_id: this._config.cognitoIdpClientId, + redirect_uri: `https://${domain}${this._config.redirectPathAuthSignIn}`, + code, + code_verifier: pkceData.pkceCodeVerifier, + }; + + const response = await this._sendCognitoRequestWithRetry(url, data, requestConfig); + return response.data; + }; +} diff --git a/assets/cf-mw-auth/tsconfig.json b/assets/cf-mw-auth/tsconfig.json new file mode 100644 index 0000000..d0399ca --- /dev/null +++ b/assets/cf-mw-auth/tsconfig.json @@ -0,0 +1,42 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "allowUnreachableCode": false, + "alwaysStrict": true, + "declaration": true, + "declarationMap": true, + "incremental": false, + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noPropertyAccessFromIndexSignature": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "strict": true, + "strictBindCallApply": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "lib": [ + "ES2022", + "DOM" + ] + }, + "include": [ + "./src/**/*.ts", + "./src/*.ts", + ], + "exclude": [ + "node_modules", + "**/*.spec.ts", + "./dist/**/*" + ] +} diff --git a/assets/cf-mw-urlrewrite/.dockerignore b/assets/cf-mw-urlrewrite/.dockerignore new file mode 100644 index 0000000..30fa193 --- /dev/null +++ b/assets/cf-mw-urlrewrite/.dockerignore @@ -0,0 +1,11 @@ +.gitignore +.git + +*Dockerfile* +*docker-compose* +.dockerignore + +.vscode/ +node_modules/ + +*.env diff --git a/assets/cf-mw-urlrewrite/.eslintrc.js b/assets/cf-mw-urlrewrite/.eslintrc.js new file mode 100644 index 0000000..a403d49 --- /dev/null +++ b/assets/cf-mw-urlrewrite/.eslintrc.js @@ -0,0 +1,35 @@ +module.exports = { + plugins: [ + 'import', + 'jest', + ], + rules: { + 'func-style': 'error', + }, + overrides: [ + { + files: [ + '**/*.{ts,tsx}', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2019, + sourceType: 'module', + tsconfigRootDir: __dirname, + project: [ + './tsconfig.json', + ], + }, + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'airbnb-typescript/base', + ], + rules: { + '@typescript-eslint/no-unused-vars': 'warn', + '@typescript-eslint/no-floating-promises': 'error', + }, + }, + ], +}; diff --git a/assets/cf-mw-urlrewrite/Dockerfile b/assets/cf-mw-urlrewrite/Dockerfile new file mode 100644 index 0000000..b9650c5 --- /dev/null +++ b/assets/cf-mw-urlrewrite/Dockerfile @@ -0,0 +1,58 @@ +# ------------------------------------------------------------------- base --- + +FROM node:18 as base + +RUN mkdir -p /opt/app +WORKDIR /opt/app + +ENV NODE_ENV development + +# intentally not installing node_modules inside the /opt/app dir; this makes +# for a better experience when using image in development environment +ADD package*.json /opt/ +RUN npm ci + +ADD ./ ./ + +# -------------------------------------------------------------------- test --- + +FROM base as test + +RUN npm run lint && npm run test + +# -------------------------------------------------------------------- test --- + +FROM test as build + +ENV OPA_VERSION=0.47.4 +RUN SYSTEM_ARCH=$(dpkg --print-architecture) \ + && curl -L -o opa https://github.com/open-policy-agent/opa/releases/download/v${OPA_VERSION}/opa_linux_${SYSTEM_ARCH}_static \ + && mv opa /usr/bin/opa \ + && chmod +x /usr/bin/opa \ + && opa -h + +RUN npm run build + +ARG SERVICE_POLICY_ENCODED=cGFja2FnZSB1cmxyZXdyaXRlcgoKcmVzdWx0IDo9IFtdCg== +RUN echo "$SERVICE_POLICY_ENCODED" | base64 -d > /opt/app/dist/policy.rego + +RUN opa build -t wasm -e urlrewriter/result /opt/app/dist/policy.rego \ + && tar -zxv -C /opt/app/dist -f bundle.tar.gz '/policy.wasm' + +# ----------------------------------------------------------------- package --- + +FROM alpine:latest as package + +RUN apk add jq + +ARG SERVICE_CONFIG_ENCODED=e30K + +COPY --from=build /opt/app/dist /opt/app/dist +COPY --from=build /opt/package-lock.json /opt/app/dist/ + +RUN echo "$SERVICE_CONFIG_ENCODED" | base64 -d | jq > /opt/app/dist/configuration.json + +RUN apk add zip \ + && cd /opt/app/dist \ + && zip -r /tmp/package.zip . + diff --git a/assets/cf-mw-urlrewrite/jest.config.js b/assets/cf-mw-urlrewrite/jest.config.js new file mode 100644 index 0000000..eddee9a --- /dev/null +++ b/assets/cf-mw-urlrewrite/jest.config.js @@ -0,0 +1,18 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + verbose: true, + resetMocks: true, + testPathIgnorePatterns: [ + "dist" + ], + + moduleNameMapper: { + "#node-web-compat": "./node-web-compat-node.js", + }, +}; + +process.env = Object.assign(process.env, { + LOG_LEVEL: 'silent', +}); diff --git a/assets/cf-mw-urlrewrite/package-lock.json b/assets/cf-mw-urlrewrite/package-lock.json new file mode 100644 index 0000000..2fc3a22 --- /dev/null +++ b/assets/cf-mw-urlrewrite/package-lock.json @@ -0,0 +1,6793 @@ +{ + "name": "cf-middleware-urlrewrite", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cf-middleware-urlrewrite", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@open-policy-agent/opa-wasm": "^1.8.0", + "pino": "^8.14.1" + }, + "devDependencies": { + "@jest/globals": "^29.5.0", + "@tsconfig/node18": "^18.2.0", + "@types/aws-lambda": "^8.10.119", + "@types/jest": "^29.5.2", + "@types/node": "^18.16.19", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "aws-sdk-client-mock": "^3.0.0", + "aws-sdk-client-mock-jest": "^3.0.0", + "esbuild": "^0.18.11", + "eslint": "^8.44.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.2", + "jest": "^29.5.0", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "dev": true, + "dependencies": { + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-policy-agent/opa-wasm": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@open-policy-agent/opa-wasm/-/opa-wasm-1.8.0.tgz", + "integrity": "sha512-IFXh52ndKH5iWsB5ysWpjDxLtA5nUCMgalV7gbzW9VfjyDvu7Iq3G3wz3cXYtK1VWa94EeYi8oIrTrzzg33szQ==", + "dependencies": { + "sprintf-js": "^1.1.2", + "yaml": "^1.10.2" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.0.tgz", + "integrity": "sha512-yhxwIlFVSVcMym3O31HoMnRXpoenmpIxcj4Yoes2DUpe+xCJnA7ECQP1Vw889V0jTt/2nzvpLQ/UuMYCd3JPIg==", + "dev": true + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.119", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.119.tgz", + "integrity": "sha512-Vqm22aZrCvCd6I5g1SvpW151jfqwTzEZ7XJ3yZ6xaZG31nUEOEyzzVImjRcsN8Wi/QyPxId/x8GTtgIbsy8kEw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/sinon": { + "version": "10.0.15", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", + "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk-client-mock": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-3.0.0.tgz", + "integrity": "sha512-4mBiWhuLYLZe1+K/iB8eYy5SAZyW2se+Keyh5u9QouMt6/qJ5SRZhss68xvUX5g3ApzROJ06QPRziYHP6buuvQ==", + "dev": true, + "dependencies": { + "@types/sinon": "^10.0.10", + "sinon": "^14.0.2", + "tslib": "^2.1.0" + } + }, + "node_modules/aws-sdk-client-mock-jest": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-3.0.0.tgz", + "integrity": "sha512-oV1rBQZc4UumLbzZAhi8UAehUq+k75hkQYGLrVIP0iJj85Z9xw+EaSsmJke/KQ8Z3vng+Xv1xbounsxpvZpunQ==", + "dev": true, + "dependencies": { + "@types/jest": "^28.1.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "aws-sdk-client-mock": "3.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/@types/jest": { + "version": "28.1.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", + "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", + "dev": true, + "dependencies": { + "expect": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/aws-sdk-client-mock-jest/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/babel-jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.6.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.460", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz", + "integrity": "sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", + "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", + "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-redact": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.1", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", + "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", + "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", + "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thread-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", + "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/assets/cf-mw-urlrewrite/package.json b/assets/cf-mw-urlrewrite/package.json new file mode 100644 index 0000000..60ff967 --- /dev/null +++ b/assets/cf-mw-urlrewrite/package.json @@ -0,0 +1,49 @@ +{ + "name": "cf-mw-urlrewrite", + "version": "1.0.0", + "description": "cloudfront middleware for advanced url rewriting", + "main": "index.js", + "contributors": [ + { + "name": "Brian Ojeda", + "email": "9335829+sgtoj@users.noreply.github.com" + } + ], + "scripts": { + "build": "npx tsc --noEmit && npx esbuild ./src/index.ts --bundle --platform=node --target=node18 --loader:.html=text --external:aws-lambda --log-level=warning --sourcemap --outfile=dist/index.js --minify", + "opa-build": "npm run opa-build:advanced_policy && npm run opa-build:sample_policy", + "opa-build:advanced_policy": "opa build -t wasm -e urlrewriter/result ./src/services/fixtures/advanced_policy.rego && tar -zxv -C ./src/services/fixtures/ -f bundle.tar.gz '/policy.wasm' && mv ./src/services/fixtures/policy.wasm ./src/services/fixtures/advanced_policy.wasm", + "opa-build:sample_policy": "opa build -t wasm -e sample/validate ./src/opa/fixtures/sample_policy.rego && tar -zxv -C ./src/opa/fixtures/ -f bundle.tar.gz '/policy.wasm' && mv ./src/opa/fixtures/policy.wasm ./src/opa/fixtures/sample_policy.wasm", + "opa-test": "npm run opa-test:advanced_policy && npm run opa-test:sample_policy", + "opa-test:sample_policy": "opa test -v ./src/opa/fixtures/sample_policy.rego ./src/opa/fixtures/sample_policy_test.rego", + "opa-test:advanced_policy": "opa test -v ./src/services/fixtures/advanced_policy.rego ./src/services/fixtures/advanced_policy_test.rego", + "test": "jest --coverage", + "tsc": "npx tsc", + "lint": "npx eslint src/**/*.ts" + }, + "license": "ISC", + "dependencies": { + "@open-policy-agent/opa-wasm": "^1.8.0", + "pino": "^8.14.1" + }, + "devDependencies": { + "@jest/globals": "^29.5.0", + "@tsconfig/node18": "^18.2.0", + "@types/aws-lambda": "^8.10.119", + "@types/jest": "^29.5.2", + "@types/node": "^18.16.19", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "aws-sdk-client-mock": "^3.0.0", + "aws-sdk-client-mock-jest": "^3.0.0", + "esbuild": "^0.18.11", + "eslint": "^8.44.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.2", + "jest": "^29.5.0", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6" + } +} diff --git a/assets/cf-mw-urlrewrite/src/commons/config.test.ts b/assets/cf-mw-urlrewrite/src/commons/config.test.ts new file mode 100644 index 0000000..5a163d2 --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/config.test.ts @@ -0,0 +1,72 @@ +import { AppConfig, AppConfigSource, AppConfigState, AppEnvironmentVariables, AppServiceConfig } from './config'; +import { AppError, AppErrorName } from './errors'; + +describe('AppConfig class', () => { + let mockProcessEnv: AppEnvironmentVariables; + + let mockAppAuthServiceConfig: AppServiceConfig; + + beforeEach(() => { + mockProcessEnv = { + AWS_LAMBDA_FUNCTION_MEMORY_SIZE: '1024MB', + AWS_LAMBDA_FUNCTION_NAME: 'test', + AWS_REGION: 'local', + AWS_EXECUTION_ENV: 'nodejs16x', + AWS_LAMBDA_FUNCTION_VERSION: '', + LOG_LEVEL: 'debug', + }; + + mockAppAuthServiceConfig = { + awsRegion: 'us-east-1', + logEnabled: true, + logLevel: 'info', + }; + }); + + it('should completely load the configuration from disk', async () => { + const config = new AppConfig(); + + await config.update(AppConfigSource.FILE, `${__dirname}/fixtures/configuration.json`); + + expect(config.state).toStrictEqual(AppConfigState.READY); + expect(config.awsRegion).toStrictEqual(mockAppAuthServiceConfig.awsRegion); + expect(config.logEnabled).toStrictEqual(mockAppAuthServiceConfig.logEnabled); + expect(config.logLevel).toStrictEqual(mockAppAuthServiceConfig.logLevel); + }); + + it('should set the correct default values', async () => { + const config = new AppConfig(); + delete mockAppAuthServiceConfig.awsRegion; + delete mockAppAuthServiceConfig.logLevel; + let error: unknown; + + try { + await config.update(AppConfigSource.STATIC, mockAppAuthServiceConfig); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(config.state).toStrictEqual(AppConfigState.READY); + expect(config.awsRegion).toStrictEqual('us-east-1'); + expect(config.logLevel).toStrictEqual('info'); + }); + + it('should error if unknown config source type is used', async () => { + const config = new AppConfig(); + let error: unknown; + + try { + await config.update('foobar' as any, ''); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeInstanceOf(AppError); + expect((error as AppError).errorName).toStrictEqual(AppErrorName.INVALID_CONFIG); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-urlrewrite/src/commons/config.ts b/assets/cf-mw-urlrewrite/src/commons/config.ts new file mode 100644 index 0000000..3d1faf3 --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/config.ts @@ -0,0 +1,72 @@ +import { Level as LogLevel } from 'pino'; +import { AppError, AppErrorName } from './errors'; +import { logger } from './logger'; +import { readFile } from './utils'; + +export interface AppEnvironmentVariables extends NodeJS.ProcessEnv { + AWS_LAMBDA_FUNCTION_MEMORY_SIZE?: string, + AWS_LAMBDA_FUNCTION_NAME?: string, + AWS_REGION?: string, + AWS_EXECUTION_ENV?: string, + AWS_LAMBDA_FUNCTION_VERSION?: string, + LOG_LEVEL?: string, + POLICY_PATH?: string, +} + +export interface AppServiceConfig { + awsRegion?: string; + logEnabled?: boolean; + logLevel?: LogLevel; +} + +export enum AppConfigSource { + FILE, + STATIC, +} + +export enum AppConfigState { + READY, + NOT_READY, +} + +export class AppConfig implements AppServiceConfig { + private _configuration: AppServiceConfig; + + private _state: AppConfigState = AppConfigState.NOT_READY; + + constructor() { + this._configuration = {} as AppServiceConfig; + } + + public get state() { + return this._state; + } + + public get awsRegion() { + return this._configuration.awsRegion || process.env.AWS_REGION || 'us-east-1'; + } + + public get logEnabled() { + return this._configuration.logEnabled || true; + } + + public get logLevel() { + return this._configuration.logLevel || 'info'; + } + + public readonly update = async (sourceType: AppConfigSource, source: string | AppServiceConfig) => { + let configuration: AppServiceConfig; + if (sourceType === AppConfigSource.FILE && typeof source === 'string') + configuration = JSON.parse((await readFile(source)).toString('utf8')); + else if (sourceType === AppConfigSource.STATIC && typeof source !== 'string') + configuration = source; + else + throw new AppError('unknown configuration source', AppErrorName.INVALID_CONFIG); + + this._configuration = configuration; + logger.configure(this._configuration); + + this._state = AppConfigState.READY; + logger.debug({ config: this._configuration }, 'app config updated'); + }; +} diff --git a/assets/cf-mw-urlrewrite/src/commons/errors.test.ts b/assets/cf-mw-urlrewrite/src/commons/errors.test.ts new file mode 100644 index 0000000..7c1d98b --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/errors.test.ts @@ -0,0 +1,29 @@ +import { AppError, AppErrorName, AppInputError } from './errors'; + +describe('AppError class', () => { + beforeEach(() => { }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should be instance of AppError', async () => { + const error = new AppError('fake error', AppErrorName.UNKNOWN); + + expect(error).toBeInstanceOf(AppError); + }); +}); + +describe('AppInputError class', () => { + beforeEach(() => { }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should be instance of AppInputError', async () => { + const error = new AppInputError('fake error', AppErrorName.UNKNOWN); + + expect(error).toBeInstanceOf(AppInputError); + }); +}); diff --git a/assets/cf-mw-urlrewrite/src/commons/errors.ts b/assets/cf-mw-urlrewrite/src/commons/errors.ts new file mode 100644 index 0000000..c880d4b --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/errors.ts @@ -0,0 +1,25 @@ +export enum AppErrorName { + INVALID_CONFIG = 'INVALID_CONFIG', + INVALID_INPUT = 'INVALID_INPUT', + COGNITO_ERROR = 'COGNITO_ERROR', + UNKNOWN = 'UNKNOWN', +} + +export class AppError extends Error { + public readonly errorName: AppErrorName; + + public constructor(message: string, errorName: AppErrorName) { + super(message); + this.errorName = errorName; + + Object.setPrototypeOf(this, AppError.prototype); + } +} + +export class AppInputError extends AppError { + public constructor(message: string, errorName: AppErrorName) { + super(message, errorName); + + Object.setPrototypeOf(this, AppInputError.prototype); + } +} diff --git a/assets/cf-mw-urlrewrite/src/commons/fixtures/configuration.json b/assets/cf-mw-urlrewrite/src/commons/fixtures/configuration.json new file mode 100644 index 0000000..2fcc2a2 --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/fixtures/configuration.json @@ -0,0 +1,4 @@ +{ + "logLevel": "info", + "awsRegion": "us-east-1" +} diff --git a/assets/cf-mw-urlrewrite/src/commons/logger.test.ts b/assets/cf-mw-urlrewrite/src/commons/logger.test.ts new file mode 100644 index 0000000..7407236 --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/logger.test.ts @@ -0,0 +1,33 @@ +import { AppLogger } from './logger'; + +describe('AppLogger class', () => { + beforeEach(() => { }); + + it('should proxy log fn commands to 3rd party logger', async () => { + const libLoggerClient = { + info: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + trace: jest.fn(), + debug: jest.fn(), + }; + const libLogger = jest.fn().mockReturnValue(libLoggerClient); + + const logger = new AppLogger(libLogger); + logger.debug('foobar'); + logger.error('foobar'); + logger.info('foobar'); + logger.trace('foobar'); + logger.warn('foobar'); + + expect(libLoggerClient.debug).toBeCalledTimes(1); + expect(libLoggerClient.error).toBeCalledTimes(1); + expect(libLoggerClient.info).toBeCalledTimes(1); + expect(libLoggerClient.trace).toBeCalledTimes(1); + expect(libLoggerClient.warn).toBeCalledTimes(1); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-urlrewrite/src/commons/logger.ts b/assets/cf-mw-urlrewrite/src/commons/logger.ts new file mode 100644 index 0000000..ae996c6 --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/logger.ts @@ -0,0 +1,63 @@ +import { pino, Logger, LogFn } from 'pino'; + +export type LoggerLib = (...args: any[]) => Logger; + +export type AppLoggerLogFn = LogFn; + +export interface AppLoggerConfig { + logLevel?: string, + [k: string]: any, +} + +export class AppLogger { + private _lib: LoggerLib; + + private _logger: Logger; + + constructor(lib?: LoggerLib) { + this._lib = lib || pino; + this._logger = this._lib(AppLogger._buildConfiguration()); + } + + public configure = (config?: AppLoggerConfig): void => { + const logConfig = AppLogger._buildConfiguration(config); + this._logger = this._lib(logConfig); + }; + + public debug: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.debug(arg, ...args); + }; + + public info: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.info(arg, ...args); + }; + + public error: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.error(arg, ...args); + }; + + public trace: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.trace(arg, ...args); + }; + + public warn: AppLoggerLogFn = (arg: any, ...args: any[]) => { + this._logger.warn(arg, ...args); + }; + + private static _buildConfiguration = (config?: AppLoggerConfig) => { + return { + enabled: config?.logEnabled || true, + base: { + memorySize: process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE, + region: process.env.AWS_REGION, + runtime: process.env.AWS_EXECUTION_ENV, + version: process.env.AWS_LAMBDA_FUNCTION_VERSION, + }, + name: process.env.AWS_LAMBDA_FUNCTION_NAME, + level: config?.logLevel || process.env.LOG_LEVEL || 'info', + useLevelLabels: true, + }; + }; +} + +export const logger = new AppLogger(); diff --git a/assets/cf-mw-urlrewrite/src/commons/types.ts b/assets/cf-mw-urlrewrite/src/commons/types.ts new file mode 100644 index 0000000..71f056b --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/types.ts @@ -0,0 +1,26 @@ +import { CloudFrontRequest, CloudFrontRequestHandler, CloudFrontRequestResult } from 'aws-lambda'; +import { Logger } from 'pino'; +import { IUrlRewriterPolicy } from '../services/url-rewriter'; +import { AppConfig } from './config'; + +export type AppLogger = Logger; + +export interface AppRequestData { + host: string; + querystring: Record; + path: string; +} + +export interface IAppServiceConstructor { + new(config: AppConfig, policy: IUrlRewriterPolicy): IAppService +} + +export interface IAppService { + handle: (request: CloudFrontRequest) => Promise +} + +export type AppServiceInitializer = (serviceClass: IAppServiceConstructor) => CloudFrontRequestHandler; + +export interface HttpHeaders { + [key: string]: string; +} diff --git a/assets/cf-mw-urlrewrite/src/commons/utils.ts b/assets/cf-mw-urlrewrite/src/commons/utils.ts new file mode 100644 index 0000000..dfb5779 --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/commons/utils.ts @@ -0,0 +1,55 @@ +import { readFile as fsReadFile } from 'fs'; + +const B64_URLSAFE_MAP = { + decode: { + '-': '+', + _: '/', + '.': '=', + }, + encode: { + '+': '-', + '/': '_', + '=': '.', + }, +}; + +export const sleep = async (time: number): Promise => { + return new Promise((resolve) => setTimeout(resolve, time)); +}; + +export const readFile = async (path: string): Promise => { + return new Promise((resolve, reject) => { + fsReadFile(path, (err, data) => !err ? resolve(data) : reject(err)); + }); +}; + +export const encodeBase64 = (data: string | Buffer): string => { + return Buffer.from(data).toString('base64'); +}; + +export const decodeBase64 = (data: string, encoding?: BufferEncoding): string => { + return Buffer.from(data, 'base64').toString(encoding); +}; + +export const stringifyUrlSafeBase64 = (data: string, trimPadding?: boolean): string => { + data = trimPadding ? data.replace(/=/, '') : data; + // @ts-expect-error + return data.replace(/[+/=]/g, (m) => B64_URLSAFE_MAP.encode[m]); +}; + +export const parseUrlSafeBase64 = (data: string) => { + // @ts-expect-error + return data.replace(/[-_.]/g, (m) => B64_URLSAFE_MAP.decode[m]); +}; + +export const isBase64 = (data: string): boolean => { + return /^[A-Za-z0-9+/]*[=]{0,2}$/.test(data); +}; + +export const isUrlSafeBase64 = (data: string): boolean => { + return /^[A-Za-z0-9_-]*[.]{0,2}$/.test(data); +}; + +export const clone = (obj: T): T => { + return JSON.parse(JSON.stringify(obj)); +}; diff --git a/assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.rego b/assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.rego new file mode 100644 index 0000000..c1ecd7e --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.rego @@ -0,0 +1,7 @@ +package sample + +import future.keywords.if + +default validate := false + +validate if input.message == "world" diff --git a/assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.wasm b/assets/cf-mw-urlrewrite/src/opa/fixtures/sample_policy.wasm new file mode 100644 index 0000000000000000000000000000000000000000..6d4735bb2b4be254d5ec43e35c4732b0688fc972 GIT binary patch literal 138998 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 fEq5tpL(9*!o#h!^G!G3~G*6Rc#F- { + let policyWasm: Buffer; + + beforeAll(async () => { + policyWasm = await readFile(`${__dirname}/fixtures/sample_policy.wasm`); + }); + + beforeEach(async () => { + }); + + it('should evalute the data and return true', async () => { + const policy = new OpaPolicy(policyWasm, {}); + let error: unknown; + let result: unknown; + + try { + result = await policy.evaluate({ message: 'world' }); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(result).toEqual(true); + }); + + it('should evaluate empty input and return false', async () => { + const policy = new OpaPolicy(policyWasm); + let error: unknown; + let result: unknown; + + try { + result = await policy.evaluate({}); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(result).toEqual(false); + }); + + it('should evaluate undefined input and return false', async () => { + const policy = new OpaPolicy(policyWasm); + let error: unknown; + let result: unknown; + + try { + result = await policy.evaluate(undefined); + } catch (err: unknown) { + error = err; + } + + expect(error).toBeUndefined(); + expect(result).toEqual(false); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); +}); diff --git a/assets/cf-mw-urlrewrite/src/opa/opa-policy.ts b/assets/cf-mw-urlrewrite/src/opa/opa-policy.ts new file mode 100644 index 0000000..b12593a --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/opa/opa-policy.ts @@ -0,0 +1,50 @@ +import { loadPolicy as opaPolicyLoader } from '@open-policy-agent/opa-wasm'; +import { readFile } from '../commons/utils'; + +export interface IOpaPolicy { + evaluate(input: T): Promise; +} + +interface IOpaLoadedPolicy { + evaluate(input: T, entrypoint?: string | number | undefined): [{ result: R }] + setData(data: Record): void; +} + +type OpaPolicyWasm = BufferSource | WebAssembly.Module; + +type OpaPolicyLoader = (regoWasm: OpaPolicyWasm, memoryDescriptor?: number | WebAssembly.MemoryDescriptor | undefined, customBuiltins?: { [builtinName: string]: Function; } | undefined) => Promise; + +export class OpaPolicy { + protected readonly _loader: OpaPolicyLoader; + + protected readonly _policyWasm: OpaPolicyWasm; + + protected _policy: IOpaLoadedPolicy | null = null; + + protected _policyData: Record | undefined; + + constructor(policyWasm: OpaPolicyWasm, policyData?: Record, loader?: OpaPolicyLoader) { + this._loader = loader || opaPolicyLoader; + this._policyWasm = policyWasm; + this._policyData = policyData; + } + + public readonly evaluate = async (input: T): Promise => { + if (!this._policy) + await this.__load(); + const response = this._policy?.evaluate(input) ?? [{ result: null }]; + return response[0]?.result; + }; + + private readonly __load = async (): Promise => { + this._policy = await this._loader(this._policyWasm); + + if (this._policyData) + await this._policy.setData(this._policyData); + }; + + public static readonly fromWasmFile = async (policyPath: string, policyData?: Record): Promise => { + const policyWasm = await readFile(policyPath); + return new OpaPolicy(policyWasm, policyData); + }; +} diff --git a/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.rego b/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.rego new file mode 100644 index 0000000..b723d8f --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.rego @@ -0,0 +1,131 @@ +package urlrewriter + +import future.keywords.contains +import future.keywords.every +import future.keywords.if +import future.keywords.in + +rules = [ + { + # /product/:productId/:productSerial + "match_uri_parts": ["product"], + "match_qs_keys": ["productId", "productSerial"], + "rewrite_base_path": "/product/index.html", + }, + { + # /product/:productId + "match_uri_parts": ["product"], + "match_qs_keys": ["productId"], + "rewrite_base_path": "/product/index.html", + }, + { + # /profile/:displayName + "match_uri_parts": ["profile"], + "match_qs_keys": ["displayName"], + "rewrite_base_path": "/profile/index.html", + }, + { + # /wallet/:tab + "match_uri_parts": ["wallet"], + "match_qs_keys": ["tab"], + "rewrite_base_path": "/wallet/index.html", + }, + { + # /withdrawal/:productId/:productSerial + "match_uri_parts": ["withdrawal"], + "match_qs_keys": ["productId", "productSerial"], + "rewrite_base_path": "/withdrawal/index.html", + }, + { + # /withdrawal/:productId + "match_uri_parts": ["withdrawal"], + "match_qs_keys": ["productId"], + "rewrite_base_path": "/product/index.html", # intended + }, + { + # /drops/:dropId + "match_uri_parts": ["drops"], + "match_qs_keys": ["dropId"], + "rewrite_base_path": "/drops/index.html", + }, +] + +REGXP_NAMED_UUID := "^[a-zA-Z0-9-_]*-([a-zA-Z0-9-]{36})$" + +REGXP_FILE_WITH_EXTENSION := ".html$" + +DEFAULT_RESULT := { + "uri": input.uri, + "querystring": input.querystring, + "action": "FORWARD", +} + +hasFileExtension(uri_parts) if { + last_path_part = uri_parts[count(uri_parts) - 1] + regex.match(REGXP_FILE_WITH_EXTENSION, last_path_part) +} + +rewrite_that_match_rules contains output if { + not hasFileExtension(input.uri_parts) + + # check input against each rule + some rule in rules + rule.match_uri_parts[rule_uri_part_index] == input.uri_parts[rule_uri_part_index] + count(input.uri_parts) == count(rule.match_uri_parts) + count(rule.match_qs_keys) + + rewrite_qs_keyvalues := array.concat( + # parse uuid out of named id within the first param + array.concat( + [x | + x := sprintf("%v=%v", [rule.match_qs_keys[0], regex.find_all_string_submatch_n(REGXP_NAMED_UUID, input.uri_parts[1], -1)[0][1]]) + ], + [x | + not regex.match(REGXP_NAMED_UUID, input.uri_parts[1]) + x := sprintf("%v=%v", [rule.match_qs_keys[0], input.uri_parts[1]]) + ], + ), + # pair param key with value skipping the first param + [x | + some match_param_index, _ in rule.match_qs_keys + match_param_index != 0 + x := sprintf("%v=%v", [rule.match_qs_keys[match_param_index], input.uri_parts[match_param_index + 1]]) + ], + ) + + output := { + "uri": rule.rewrite_base_path, + "querystring": trim_prefix(concat("&", array.concat([input.querystring], rewrite_qs_keyvalues)), "&"), + "action": "FORWARD", + } +} + +rewrite_path_with_index_suffix contains output if { + not hasFileExtension(input.uri_parts) + regex.match("/$", input.uri) + + output := { + "uri": sprintf("/%v/index.html", [concat("/", input.uri_parts)]), + "querystring": trim_prefix(input.querystring, "&"), + "action": "FORWARD", + } +} + +redirect_path_without_trailing_slash contains output if { + not hasFileExtension(input.uri_parts) + not regex.match("/$", input.uri) + + output := { + "uri": sprintf("/%v/", [concat("/", input.uri_parts)]), + "querystring": trim_prefix(input.querystring, "&"), + "action": "REDIRECT_301", + } +} + +# finalize result (only first item is used if items in 'result' array) +result := array.concat( + [x | some x in rewrite_that_match_rules], + array.concat( + [x | some x in (rewrite_path_with_index_suffix | redirect_path_without_trailing_slash)], + [DEFAULT_RESULT], + ), +) diff --git a/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.wasm b/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy.wasm new file mode 100644 index 0000000000000000000000000000000000000000..40dbfbd439835ccc118adfeff059e69082f43d7e GIT binary patch literal 352171 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 -Mw< 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�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

0PlGN9beEjI-$xOY&KN&68h5 zXQC=lhm<5VTQWdPpUf|zB;PYLRn1L)7BS^N zENQ7=F&t`COk5Ur#o=E4ikC-R&`cQVpW*u_L*Mo_Tp6=yI zW%|o3O$)B8A|`~`A;SA|`Hu2cIacUg3u8!y*;;1-ij+T2l^_s9##XtLb z>a`L27-J)LG`fMkT=u$%ybvGjL;l7GM(?PO-=+gXPY|1Z)6}T0>myW+Lxq=qiI98S zheNI#B0@(P8DopQ0&k(;M*@3bZ2gk z7#!k^8VnhXruzz*TOx*qI55sTH!wm&50k)d^S9)>H6k^{m5Hnb9TK9h>Ii*qwh_hj z)qhMUg}R>Mx-CMVPCBWqe4lo2k2pD495pv#20}7;I9LcXU!3Z#ELzsoQoXJ_LT*m- zwMsJ4N%9R(m6hKap)c8J+}yazS*ka&BHeXYgqp-gv}HvXza%6Tlggy`sv=z)P_!p$ zJg1;X|HdL}hHH7mg?ekO;l&9oqEXC8DD`$wQ#SK=URDiJ2zkFVGF<;(aaXe2L=Z&D zp`?)H2jGMd2X}%kkDVyFaERhDSPBLbTjYQ=@|uK$9eFwA;saj+U%+_1 zo))b)$eFFsjMNcwMl70w9JrG6i4k%ZxYM@Mx+zM4X2$IVXc2M_IBqWRS3jVZ^T2~j zS%iC{k}m*V`%iC}T$%tDItDx+E+j@5arcqIsxJ zALw%#_`7e(F5Zc7P&xw4Wu4XwxQi@Rq;b0eh`8V=xgwjG!5L~Awd~|79AMWohIG#` zVB*$#SJtoi5Js*6H-M>rrcje4ZEDb!kn6w^(~?(OAyt?QV2wFWak5O|DMB<|4}w8ATLn37ys07K3dQQ zR}7TxC8*AQy^))`@OmoMFIyjmlP6HGfVL8VX%rR$td9+L>J>Rnu00TZXl9_r5kI+=G>hNd%bjK*7f#ha=SctA?If2 zGkdb{VVjK~LtLdX;=hZzGBAx=z4ieTHa4N3xx09n3=1QWQ^Xb~n5<&zrH?RW7b@eH z0%PN@6i|Rl(F|*tB4`@N$qJIZ^KsSHDaHZC2 ztgh5?vTOc?VYCZ+?Xlcc8_FA38ufC!gkd`eM(`(v3RcR|;_ARizSyp{+FMF^3b?q# yNyg$aCptEkh$kE;o=7^0iKH_=Hkm9JD#c`ZB0gD-IvqSxbUF&l)WlTGN&W&J>UNC) literal 0 HcmV?d00001 diff --git a/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy_test.rego b/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy_test.rego new file mode 100644 index 0000000..338553f --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/services/fixtures/advanced_policy_test.rego @@ -0,0 +1,124 @@ +package urlrewriter + +import future.keywords.contains +import future.keywords.every +import future.keywords.if +import future.keywords.in + +gen_request(uri, querystring) = value if { + value := { + "uri": uri, + "uri_parts": split(trim_suffix(trim_prefix(uri, "/"), "/"), "/"), + "querystring": querystring, + } +} + +test_passthrough_for_request_with_file_extensions if { + request := gen_request("/test.html", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "", + "uri": "/test.html", + "action": "FORWARD", + } +} + +test_redirect_with_trailing_slash if { + request := gen_request("/foo", "foo=bar") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "foo=bar", + "uri": "/foo/", + "action": "REDIRECT_301", + } +} + +test_suffixing_index_html if { + request := gen_request("/foo/", "foo=bar") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "foo=bar", + "uri": "/foo/index.html", + "action": "FORWARD", + } +} + +test_product_path_with_id if { + request := gen_request("/product/testing-foo-00000000-aaaa-bbbb-cccc-111111111111", "foo=bar") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "foo=bar&productId=00000000-aaaa-bbbb-cccc-111111111111", + "uri": "/product/index.html", + "action": "FORWARD", + } +} + +test_product_path_with_id_and_serial if { + request := gen_request("/product/testing-foo-00000000-aaaa-bbbb-cccc-111111111111/123", "foo=bar") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "foo=bar&productId=00000000-aaaa-bbbb-cccc-111111111111&productSerial=123", + "uri": "/product/index.html", + "action": "FORWARD", + } +} + +test_withdrawal_path if { + request := gen_request("/withdrawal/", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "", + "uri": "/withdrawal/index.html", + "action": "FORWARD", + } +} + +test_withdrawal_path_with_id if { + request := gen_request("/withdrawal/00000000-aaaa-bbbb-cccc-222222222222", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "productId=00000000-aaaa-bbbb-cccc-222222222222", + "uri": "/product/index.html", # intended + "action": "FORWARD", + } +} + +test_withdrawal_path_with_id_and_serial if { + request := gen_request("/withdrawal/00000000-aaaa-bbbb-cccc-222222222222/234", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "productId=00000000-aaaa-bbbb-cccc-222222222222&productSerial=234", + "uri": "/withdrawal/index.html", + "action": "FORWARD", + } +} + +test_drops_path if { + request := gen_request("/drops/", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "", + "uri": "/drops/index.html", + "action": "FORWARD", + } +} + +test_drops_path_with_id if { + request := gen_request("/drops/00000000-aaaa-bbbb-cccc-333333333333", "") + response = result with input as request + print(response[0]) + response[0] == { + "querystring": "dropId=00000000-aaaa-bbbb-cccc-333333333333", + "uri": "/drops/index.html", + "action": "FORWARD", + } +} diff --git a/assets/cf-mw-urlrewrite/src/services/fixtures/cf-req-events.ts b/assets/cf-mw-urlrewrite/src/services/fixtures/cf-req-events.ts new file mode 100644 index 0000000..72ed1fa --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/services/fixtures/cf-req-events.ts @@ -0,0 +1,186 @@ +import { CloudFrontRequestEvent } from 'aws-lambda'; + +export const authed: CloudFrontRequestEvent = { + 'Records': [ + { + 'cf': { + 'config': { + 'distributionDomainName': 'abcd0123456789.cloudfront.net', + 'distributionId': 'ABCD0123456789', + 'eventType': 'viewer-request', + 'requestId': 'abcd0123-0123-0123-0123-0123456789ab', + }, + 'request': { + 'clientIp': '0.0.0.0', + 'headers': { + 'host': [ + { + 'key': 'Host', + 'value': 'app.dev.example.com', + }, + ], + 'user-agent': [ + { + 'key': 'User-Agent', + 'value': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36', + }, + ], + 'upgrade-insecure-requests': [ + { + 'key': 'upgrade-insecure-requests', + 'value': '1', + }, + ], + 'accept': [ + { + 'key': 'accept', + 'value': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', + }, + ], + 'sec-gpc': [ + { + 'key': 'sec-gpc', + 'value': '1', + }, + ], + 'sec-fetch-site': [ + { + 'key': 'sec-fetch-site', + 'value': 'none', + }, + ], + 'sec-fetch-mode': [ + { + 'key': 'sec-fetch-mode', + 'value': 'navigate', + }, + ], + 'sec-fetch-user': [ + { + 'key': 'sec-fetch-user', + 'value': '?1', + }, + ], + 'sec-fetch-dest': [ + { + 'key': 'sec-fetch-dest', + 'value': 'document', + }, + ], + 'accept-encoding': [ + { + 'key': 'accept-encoding', + 'value': 'gzip, deflate, br', + }, + ], + 'accept-language': [ + { + 'key': 'accept-language', + 'value': 'en-US,en;q=0.9', + }, + ], + }, + 'method': 'GET', + 'querystring': '', + 'uri': '/user/test.html', + }, + }, + }, + ], +}; + +export const unauthed: CloudFrontRequestEvent = { + 'Records': [ + { + 'cf': { + 'config': { + 'distributionDomainName': 'abcd0123456789.cloudfront.net', + 'distributionId': 'ABCD0123456789', + 'eventType': 'viewer-request', + 'requestId': 'abcd0123-0123-0123-0123-0123456789ab', + }, + 'request': { + 'clientIp': '0.0.0.0', + 'headers': { + 'host': [ + { + 'key': 'Host', + 'value': 'abcd0123456789.cloudfront.net', + }, + ], + 'user-agent': [ + { + 'key': 'User-Agent', + 'value': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36', + }, + ], + 'cache-control': [ + { + 'key': 'cache-control', + 'value': 'max-age=0', + }, + ], + 'upgrade-insecure-requests': [ + { + 'key': 'upgrade-insecure-requests', + 'value': '1', + }, + ], + 'accept': [ + { + 'key': 'accept', + 'value': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', + }, + ], + 'sec-gpc': [ + { + 'key': 'sec-gpc', + 'value': '1', + }, + ], + 'sec-fetch-site': [ + { + 'key': 'sec-fetch-site', + 'value': 'none', + }, + ], + 'sec-fetch-mode': [ + { + 'key': 'sec-fetch-mode', + 'value': 'navigate', + }, + ], + 'sec-fetch-user': [ + { + 'key': 'sec-fetch-user', + 'value': '?1', + }, + ], + 'sec-fetch-dest': [ + { + 'key': 'sec-fetch-dest', + 'value': 'document', + }, + ], + 'accept-encoding': [ + { + 'key': 'accept-encoding', + 'value': 'gzip, deflate, br', + }, + ], + 'accept-language': [ + { + 'key': 'accept-language', + 'value': 'en-US,en;q=0.9', + }, + ], + }, + 'method': 'GET', + 'querystring': '', + 'uri': '/user/cart.html', + }, + }, + }, + ], +}; + diff --git a/assets/cf-mw-urlrewrite/src/services/url-rewriter.test.ts b/assets/cf-mw-urlrewrite/src/services/url-rewriter.test.ts new file mode 100644 index 0000000..e0c431c --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/services/url-rewriter.test.ts @@ -0,0 +1,135 @@ +import { CloudFrontRequest, CloudFrontRequestEvent, CloudFrontRequestResult, CloudFrontResultResponse } from 'aws-lambda'; +import { AppConfig, AppConfigSource, AppServiceConfig } from '../commons/config'; +import { clone, readFile } from '../commons/utils'; +import { OpaPolicy } from '../opa/opa-policy'; +import * as cfRequestEvents from './fixtures/cf-req-events'; +import { UrlRewriter } from './url-rewriter'; + +const makeRequest = (base: CloudFrontRequestEvent, overrides: object): CloudFrontRequest => { + const payload = clone(base); + const request = payload?.Records?.[0]?.cf.request as CloudFrontRequest; + Object.assign(request, overrides); + return request; +}; + +describe('UrlRewriterService', () => { + describe('test advance rewrite policy with complex rules', () => { + let mockServiceConfig: AppServiceConfig; + + let urlRewriter: UrlRewriter; + + beforeEach(async () => { + mockServiceConfig = { + logLevel: 'info', + }; + + const config = new AppConfig(); + await config.update(AppConfigSource.STATIC, mockServiceConfig); + + const policyWasm = await readFile(`${__dirname}/fixtures/advanced_policy.wasm`); + const policy = new OpaPolicy(policyWasm); + urlRewriter = new UrlRewriter(config, policy); + }); + + it('should passthrough when path is a file with extension', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/test.html' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result).not.toBeNull(); + expect(result.uri).toEqual('/test.html'); + }); + + it('should redirect to path with trailing slash', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/foo', querystring: 'foo=bar' }); + const result = await urlRewriter.handle(request) as CloudFrontResultResponse; + + expect(result != null); + expect(result.status).toEqual('301'); + expect(result.headers?.location?.[0]?.value).toEqual('/foo/?foo=bar'); + }); + + it('should append index.html to request', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/foo/', querystring: 'foo=bar' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/foo/index.html'); + expect(result.querystring).toEqual('foo=bar'); + }); + + describe('/product path', () => { + it('handle request with id in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/product/testing-foo-00000000-aaaa-bbbb-cccc-111111111111/', querystring: 'foo=bar' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/product/index.html'); + expect(result.querystring).toEqual('foo=bar&productId=00000000-aaaa-bbbb-cccc-111111111111'); + }); + + it('handle rqeuest with id and serial in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/product/testing-foo-00000000-aaaa-bbbb-cccc-111111111111/123', querystring: 'foo=bar' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/product/index.html'); + expect(result.querystring).toEqual('foo=bar&productId=00000000-aaaa-bbbb-cccc-111111111111&productSerial=123'); + + }); + }); + + describe('/withdrawal path', () => { + it('handle request without any params in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/withdrawal/' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/withdrawal/index.html'); + expect(result.querystring).toEqual(''); + }); + + it('handle request with id in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/withdrawal/00000000-aaaa-bbbb-cccc-222222222222' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/product/index.html'); + expect(result.querystring).toEqual('productId=00000000-aaaa-bbbb-cccc-222222222222'); + }); + + it('handle request with id and serial in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/withdrawal/00000000-aaaa-bbbb-cccc-222222222222/234' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/withdrawal/index.html'); + expect(result.querystring).toEqual('productId=00000000-aaaa-bbbb-cccc-222222222222&productSerial=234'); + }); + }); + + describe('/drops path', () => { + it('handle request without any params in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/drops/' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/drops/index.html'); + expect(result.querystring).toEqual(''); + }); + + it('handle request with id in path', async () => { + const request = makeRequest(cfRequestEvents.authed, { uri: '/drops/00000000-aaaa-bbbb-cccc-333333333333' }); + const result = await urlRewriter.handle(request) as CloudFrontRequest; + + expect(result != null); + expect(result.uri).toEqual('/drops/index.html'); + expect(result.querystring).toEqual('dropId=00000000-aaaa-bbbb-cccc-333333333333'); + }); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + }); + +}); diff --git a/assets/cf-mw-urlrewrite/src/services/url-rewriter.ts b/assets/cf-mw-urlrewrite/src/services/url-rewriter.ts new file mode 100644 index 0000000..ab0849d --- /dev/null +++ b/assets/cf-mw-urlrewrite/src/services/url-rewriter.ts @@ -0,0 +1,74 @@ +import { CloudFrontRequest, CloudFrontRequestResult, CloudFrontResultResponse } from 'aws-lambda'; +import { AppConfig } from '../commons/config'; +import { logger } from '../commons/logger'; +import { IAppService } from '../commons/types'; + +export interface IUrlRewriterPolicy { + evaluate: (input: T) => Promise; +} + +export interface UrlRewriterPolicyEvaluateInput { + uri: string; + uri_parts: string[]; + querystring: string; +} + +export interface UrlRewriterPolicyEvaluateOutput { + uri: string; + querystring: string; + action?: 'REDIRECT_301' | 'REDIRECT_302' | 'FORWARD'; +} + +export class UrlRewriter implements IAppService { + protected readonly _config: AppConfig; + + protected readonly _policy: IUrlRewriterPolicy; + + constructor(config: AppConfig, policy: IUrlRewriterPolicy) { + this._config = config; + this._policy = policy; + } + + public handle = async (request: CloudFrontRequest): Promise => { + const input: UrlRewriterPolicyEvaluateInput = { + uri: request.uri, + uri_parts: request.uri.split('/').filter((p) => p.length > 0), + querystring: request.querystring, + }; + + try { + const response = await this._policy.evaluate(input); + const result = response[0]; + logger.debug({ response }, 'request evaluated against policy'); + + if (!result) + return request; + else if (result.action === 'REDIRECT_301' || result.action === 'REDIRECT_302') + return this._respondWithRedirect(result, request); + else + return this._respondWithUrlRewrite(result, request); + } catch (err: unknown) { + logger.error({ error: err }, 'error evaluating request against policy'); + return request; + } + }; + + private _respondWithRedirect = (input: UrlRewriterPolicyEvaluateOutput, request: CloudFrontRequest) => { + const querystring = input.querystring ? `?${input.querystring}` : ''; + return { + status: input.action === 'REDIRECT_301' ? '301' : '302', + headers: { + location: [{ + key: 'location', + value: `${input.uri || '/'}${querystring}`, + }], + }, + }; + }; + + private _respondWithUrlRewrite = (input: UrlRewriterPolicyEvaluateOutput, request: CloudFrontRequest) => { + request.uri = input.uri; + request.querystring = input.querystring; + return request; + }; +} diff --git a/assets/cf-mw-urlrewrite/tsconfig.json b/assets/cf-mw-urlrewrite/tsconfig.json new file mode 100644 index 0000000..d0399ca --- /dev/null +++ b/assets/cf-mw-urlrewrite/tsconfig.json @@ -0,0 +1,42 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "allowUnreachableCode": false, + "alwaysStrict": true, + "declaration": true, + "declarationMap": true, + "incremental": false, + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noPropertyAccessFromIndexSignature": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "strict": true, + "strictBindCallApply": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "lib": [ + "ES2022", + "DOM" + ] + }, + "include": [ + "./src/**/*.ts", + "./src/*.ts", + ], + "exclude": [ + "node_modules", + "**/*.spec.ts", + "./dist/**/*" + ] +} diff --git a/examples/complete/assets/index.html b/examples/complete/assets/index.html new file mode 100644 index 0000000..42db73e --- /dev/null +++ b/examples/complete/assets/index.html @@ -0,0 +1,13 @@ + + + + + My Static Website + + + +

Welcome to my static website!

+

This is a simple static website hosted on AWS S3 and deployed using a Terraform module.

+ + + diff --git a/examples/complete/main.tf b/examples/complete/main.tf index 8b13789..b318504 100755 --- a/examples/complete/main.tf +++ b/examples/complete/main.tf @@ -1 +1,246 @@ +locals { + domain_name = var.domain_name + domain_parent_hosted_zone_id = var.domain_parent_hosted_zone_id + mime_types = { + "html" = "text/html" + "css" = "text/css" + "js" = "application/javascript" + "json" = "application/json" + "png" = "image/png" + "jpg" = "image/jpeg" + "gif" = "image/gif" + "svg" = "image/svg+xml" + } +} + +# ================================================================== example === + +module "cognito_user_pool_client" { + source = "rallyware/cognito-user-pool-client/aws" + version = "0.2.0" + + user_pool_id = module.cognito_user_pool.id + allowed_oauth_flows_user_pool_client = true + generate_secret = true + allowed_oauth_flows = ["code", ] + allowed_oauth_scopes = ["openid", "email", "profile"] + callback_urls = ["https://${local.domain_name}/_edge/auth/signin"] + logout_urls = ["https://google.com"] + supported_identity_providers = ["COGNITO"] + + explicit_auth_flows = [ + "ALLOW_USER_PASSWORD_AUTH", + "ALLOW_REFRESH_TOKEN_AUTH", + "ALLOW_USER_SRP_AUTH", + "ALLOW_CUSTOM_AUTH", + "ALLOW_ADMIN_USER_PASSWORD_AUTH", + ] + + context = module.example_label.context +} + +module "cloudfront_middleware_at_edge" { + source = "../../" + + auth_service_config = { + enabled = true + log_level = "debug" + cognito_idp_arn = module.cognito_user_pool.arn + cognito_idp_domain = "${aws_cognito_user_pool_domain.this.domain}.auth.us-east-1.amazoncognito.com" + cognito_idp_client_id = module.cognito_user_pool_client.id + cognito_idp_client_secret = module.cognito_user_pool_client.client_secret + cognito_idp_client_scopes = ["openid", "email", "profile"] + cognito_idp_jwks = jsondecode(data.http.cognito_user_pool_jwks.response_body) + } + + # urlrewrite_service_config = { + # enabled = true + # log_level = "debug" + # policy_content = <<-EOF + # package urlrewriter + # result := [] + # EOF + # } + + context = module.example_label.context # not-required +} + +module "website" { + source = "cloudposse/cloudfront-s3-cdn/aws" + version = "0.90.0" + + aliases = [local.domain_name] + acm_certificate_arn = module.ssl_certificate.arn + dns_alias_enabled = false + + custom_origins = [{ + # blackhole (never served) origin assigned to auth-at-edge behaviors/paths + domain_name = "blackhole.example.com" + origin_id = "blackhole" + origin_path = "" + custom_headers = [] + custom_origin_config = { + http_port = 80 + https_port = 443 + origin_protocol_policy = "https-only" + origin_ssl_protocols = ["TLSv1.2"] + origin_keepalive_timeout = 60 + origin_read_timeout = 60 + } + }] + + ordered_cache = [ + for x in module.cloudfront_middleware_at_edge.auth_routes : { + target_origin_id = "blackhole" + path_pattern = x.path_pattern + allowed_methods = x.allowed_methods + compress = x.compress + cache_policy_id = x.cache_policy + origin_request_policy_id = x.origin_request_policy + response_headers_policy_id = x.response_headers_policy + lambda_function_association = x.lambda_function_association + viewer_protocol_policy = x.viewer_protocol_policy + + // using cf policies so these are not used but are required to be defined + cached_methods = ["GET", "HEAD"] + default_ttl = null + forward_cookies = null + forward_cookies_whitelisted_names = null + forward_header_values = null + forward_query_string = null + function_association = [] + max_ttl = null + min_ttl = null + trusted_key_groups = null + trusted_signers = null + }] + + cache_policy_id = try(data.aws_cloudfront_cache_policy.disabled.id) + origin_request_policy_id = try(data.aws_cloudfront_origin_request_policy.cors_s3origin.id) + response_headers_policy_id = try(data.aws_cloudfront_response_headers_policy.cors_preflight_hsts.id) + + lambda_function_association = [ + { + event_type = "viewer-request" + lambda_arn = module.cloudfront_middleware_at_edge.auth_services.check_auth.fn_arn + include_body = false + }, + ] + + cloudfront_access_log_create_bucket = false + cloudfront_access_logging_enabled = false + s3_access_logging_enabled = false + versioning_enabled = false + + context = module.example_label.context +} + +# ===================================================== supporting-resources === + +module "example_label" { + source = "cloudposse/label/null" + version = "0.25.0" + + name = "example-cf-middleware-${random_string.example_random_suffix.result}" +} + +resource "random_string" "example_random_suffix" { + length = 6 + special = false + upper = false +} + +# ------------------------------------------------------------------ website --- + +resource "aws_s3_object" "website_assets" { + for_each = fileset("${path.module}/assets", "**/*") + + bucket = module.website.s3_bucket + key = each.key + source = "${path.module}/assets/${each.key}" + etag = filemd5("${path.module}/assets/${each.key}") + content_type = lookup(local.mime_types, try(split(".", each.key)[1], "unknown"), "application/octet-stream") +} + +module "dns" { + source = "cloudposse/route53-alias/aws" + version = "0.13.0" + + aliases = [local.domain_name] + parent_zone_id = local.domain_parent_hosted_zone_id + target_dns_name = module.website.cf_domain_name + target_zone_id = module.website.cf_hosted_zone_id + ipv6_enabled = false + + context = module.example_label.context +} + +module "ssl_certificate" { + source = "cloudposse/acm-request-certificate/aws" + version = "0.17.0" + + domain_name = local.domain_name + process_domain_validation_options = true + ttl = "60" + zone_id = local.domain_parent_hosted_zone_id + + tags = merge(module.example_label.tags, { Name = module.example_label.id }) + context = module.example_label.context +} + +data "aws_cloudfront_cache_policy" "disabled" { + name = "Managed-CachingDisabled" +} + +data "aws_cloudfront_origin_request_policy" "cors_s3origin" { + name = "Managed-CORS-S3Origin" +} + +data "aws_cloudfront_response_headers_policy" "cors_preflight_hsts" { + name = "Managed-CORS-with-preflight-and-SecurityHeadersPolicy" +} + +# ------------------------------------------------------------------ cognito --- + +module "cognito_user_pool" { + source = "lgallard/cognito-user-pool/aws" + version = "0.22.0" + + user_pool_name = module.example_label.id + alias_attributes = [] + auto_verified_attributes = [] + deletion_protection = "INACTIVE" + + admin_create_user_config = { + allow_admin_create_user_only = true + } + + tags = module.example_label.tags +} + +resource "aws_cognito_user_pool_domain" "this" { + domain = module.example_label.id + user_pool_id = module.cognito_user_pool.id +} + +resource "random_password" "test_user_password" { + special = true + override_special = "!#$-_=+" + length = 16 + min_numeric = 1 + min_lower = 1 + min_upper = 1 + min_special = 1 +} + +resource "aws_cognito_user" "test_user" { + user_pool_id = module.cognito_user_pool.id + username = "test@example.com" + password = random_password.test_user_password.result + enabled = true +} + +data "http" "cognito_user_pool_jwks" { + url = "https://${module.cognito_user_pool.endpoint}/.well-known/jwks.json" +} diff --git a/examples/complete/output.tf b/examples/complete/output.tf index 8b13789..0b68396 100644 --- a/examples/complete/output.tf +++ b/examples/complete/output.tf @@ -1 +1,17 @@ +output "website_domain_name" { + description = "The domain name of the website" + value = "https://${local.domain_name}" +} +output "website_cf_domain_name" { + description = "The domain name of the CloudFront distribution" + value = module.website.cf_domain_name +} + +output "test_user_credentials" { + description = "The credentials of the test user" + value = { + username = aws_cognito_user.test_user.username + password = nonsensitive(random_password.test_user_password.result) + } +} diff --git a/examples/complete/variables.tf b/examples/complete/variables.tf index 8b13789..0b95cd9 100644 --- a/examples/complete/variables.tf +++ b/examples/complete/variables.tf @@ -1 +1,9 @@ +variable "domain_name" { + description = "The domain name to use for the Yopass website." + type = string +} +variable "domain_parent_hosted_zone_id" { + description = "The ID of the Route 53 hosted zone for the domain name." + type = string +} diff --git a/examples/complete/version.tf b/examples/complete/version.tf index 758f8f6..29e39b4 100644 --- a/examples/complete/version.tf +++ b/examples/complete/version.tf @@ -1,10 +1,12 @@ terraform { required_providers { aws = { - source = "hashicorp/aws" + source = "hashicorp/aws" + version = ">= 4.9.0, < 5.0.0" } docker = { - source = "kreuzwerker/docker" + source = "kreuzwerker/docker" + version = ">= 3.0.0, < 4.0.0" } } } diff --git a/main.tf b/main.tf index 8b13789..2f84f64 100755 --- a/main.tf +++ b/main.tf @@ -1 +1,307 @@ +locals { + name = coalesce(module.this.name, var.name, "cf-middleware-${random_string.mw_service_random_suffix.result}") + enabled = module.this.enabled + auth_service_enabled = local.enabled && var.auth_service_config.enabled + urlrewrite_service_enabled = local.enabled && var.urlrewrite_service_config.enabled + destruction_delay_enabled = var.destruction_delay != null + + aws_account_id = try(coalesce(var.aws_account_id, data.aws_caller_identity.current[0].account_id), "") + aws_region_name = try(coalesce(var.aws_region_name, data.aws_region.current[0].name), "") + + service_config = { + rewrite_url = { + enabled = local.urlrewrite_service_enabled + handler = "index.handle" + type = "urlrewrite" + } + check_auth = { + enabled = local.auth_service_enabled + handler = "index.checkAuthHandler" + type = "auth" + } + parse_auth = { + enabled = local.auth_service_enabled + handler = "index.parseAuthHandler" + type = "auth" + } + refresh_auth = { + enabled = local.auth_service_enabled + handler = "index.refreshAuthHandler" + type = "auth" + } + revoke_auth = { + enabled = local.auth_service_enabled + handler = "index.revokeAuthHandler" + type = "auth" + } + } + + auth_service_names = toset([for svc_name, svc_opts in local.service_config : svc_name if svc_opts.enabled && svc_opts.type == "auth"]) + + auth_service_config = { + awsRegion = coalesce(var.auth_service_config.aws_region, local.aws_region_name) + cognitoIdpArn = var.auth_service_config.cognito_idp_arn + cognitoIdpDomain = var.auth_service_config.cognito_idp_domain + cognitoIdpJwks = var.auth_service_config.cognito_idp_jwks + cognitoIdpClientId = var.auth_service_config.cognito_idp_client_id + cognitoIdpClientSecret = var.auth_service_config.cognito_idp_client_secret + cognitoIdpClientScopes = var.auth_service_config.cognito_idp_client_scopes + redirectPathAuthRefresh = "/_edge/auth/refresh" + redirectPathAuthSignIn = "/_edge/auth/signin" + redirectPathAuthSignOut = "/" + urlSignOut = "/_edge/auth/signout" + logLevel = var.auth_service_config.log_level + oidcStateEncryptionKey = local.enabled ? random_password.auth_service_oidc_state_encrypt_key[0].result : "" + opaPolicyEnabled = var.auth_service_config.opa_policy_content != null && var.auth_service_config.opa_policy_content != "" + opaPolicyData = var.auth_service_config.opa_policy_data + } + + auth_service_config_default_opa_policy_content = <<-EOF + package auth_at_edge_authz + results := [] + EOF + + urlrewrite_service_names = toset([for svc_name, svc_opts in local.service_config : svc_name if svc_opts.enabled && svc_opts.type == "urlrewrite"]) + + urlrewrite_service_config = { + logLevel = var.urlrewrite_service_config.log_level + policyPath = "/opt/app/dist/policy.wasm" + } + + urlrewrite_policy_content = coalesce( + var.urlrewrite_service_config.policy_content, + <<-EOF + package urlrewriter + result := [] + EOF + ) +} + +data "aws_caller_identity" "current" { + count = module.this.enabled && var.aws_account_id == "" ? 1 : 0 +} + +data "aws_region" "current" { + count = module.this.enabled && var.aws_region_name == "" ? 1 : 0 +} + +resource "time_sleep" "destruction_delay" { + for_each = local.destruction_delay_enabled ? aws_lambda_function.auth_service : {} + + destroy_duration = var.destruction_delay + + triggers = { + arn = each.value.arn + } +} + +# ====================================================== middleware-services === + +module "mw_service_label" { + source = "cloudposse/label/null" + version = "0.25.0" + + name = local.name + context = module.this.context +} + +resource "random_string" "mw_service_random_suffix" { + length = 6 + special = false + upper = false +} + +# --------------------------------------------------------------- cf-polices --- + +data "aws_cloudfront_response_headers_policy" "cors_preflight_hsts" { + count = local.enabled ? 1 : 0 + name = "Managed-CORS-with-preflight-and-SecurityHeadersPolicy" +} + +data "aws_cloudfront_origin_request_policy" "all" { + count = local.enabled ? 1 : 0 + name = "Managed-AllViewer" +} + +data "aws_cloudfront_cache_policy" "disabled" { + count = local.enabled ? 1 : 0 + name = "Managed-CachingDisabled" +} + +# ---------------------------------------------------------------------- iam --- + +resource "aws_iam_role" "this" { + count = local.enabled ? 1 : 0 + + name = module.mw_service_label.id + description = "" + + assume_role_policy = jsonencode({ + Version = "2012-10-17", + Statement = [{ + Effect = "Allow" + Principal = { "Service" : ["edgelambda.amazonaws.com", "lambda.amazonaws.com"] } + Action = ["sts:AssumeRole", "sts:TagSession"] + }] + }) + + managed_policy_arns = [ + "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + + tags = module.mw_service_label.tags + + lifecycle { + create_before_destroy = true + } +} + +# ============================================================ auth-services === + +module "mw_auth_service_label" { + source = "cloudposse/label/null" + version = "0.25.0" + for_each = local.auth_service_names + + attributes = [each.key] + context = module.mw_service_label.context +} + +module "auth_service_code" { + source = "sgtoj/artifact-packager/docker" + version = "1.2.3" + + enabled = local.auth_service_enabled + attributes = ["auth"] + artifact_src_path = "/tmp/package.zip" + artifact_dst_directory = "${path.module}/dist" + docker_build_context = abspath("${path.module}/assets/cf-mw-auth") + docker_build_args = { SERVICE_CONFIG_ENCODED = base64encode(jsonencode(local.auth_service_config)), SERVICE_POLICY_ENCODED = base64encode(coalesce(var.auth_service_config.opa_policy_content, local.auth_service_config_default_opa_policy_content)) } + docker_build_target = "package" + + context = module.mw_service_label.context +} + +resource "random_password" "auth_service_oidc_state_encrypt_key" { + count = local.enabled ? 1 : 0 + + length = 32 # 256 bits + special = true +} + +resource "random_string" "auth_service" { + for_each = local.auth_service_names + + length = 8 + special = false + lower = false + upper = true + + keepers = { + name = each.key + } +} + +resource "aws_lambda_function" "auth_service" { + for_each = local.auth_service_names + + function_name = "${module.mw_auth_service_label[each.key].id}-${random_string.auth_service[each.key].result}" + filename = module.auth_service_code.artifact_package_path + handler = local.service_config[each.key].handler + publish = true + runtime = "nodejs18.x" + timeout = 5 + role = aws_iam_role.this[0].arn + layers = [] + + tags = module.mw_auth_service_label[each.key].tags + + lifecycle { + create_before_destroy = true + } + + depends_on = [ + module.auth_service_code + ] +} + +resource "aws_lambda_permission" "auth_service_allow_cloudfront" { + for_each = aws_lambda_function.auth_service + + function_name = each.value.function_name + statement_id = "AllowExecutionFromCloudFront" + action = "lambda:GetFunction" + principal = "edgelambda.amazonaws.com" +} + +# ====================================================== urlrewrite-services === + +module "mw_urlrewrite_service_label" { + source = "cloudposse/label/null" + version = "0.25.0" + for_each = local.urlrewrite_service_names + + attributes = [each.key] + context = module.mw_service_label.context +} + +module "urlrewrite_service_code" { + source = "sgtoj/artifact-packager/docker" + version = "1.2.3" + + enabled = local.urlrewrite_service_enabled + attributes = ["urlrewrite"] + artifact_dst_directory = "${path.module}/dist" + artifact_src_path = "/tmp/package.zip" + docker_build_context = abspath("${path.module}/assets/cf-mw-urlrewrite") + docker_build_args = { SERVICE_CONFIG_ENCODED = base64encode(jsonencode(local.urlrewrite_service_config)), SERVICE_POLICY_ENCODED = base64encode(local.urlrewrite_policy_content) } + docker_build_target = "package" + + context = module.mw_service_label.context +} + +resource "random_string" "urlrewrite_service" { + for_each = local.urlrewrite_service_names + + length = 8 + special = false + lower = false + upper = true + + keepers = { + name = each.key + } +} + +resource "aws_lambda_function" "urlrewrite_service" { + for_each = local.urlrewrite_service_names + + function_name = "${module.mw_urlrewrite_service_label[each.key].id}- ${random_string.urlrewrite_service[each.key].result}" + filename = module.urlrewrite_service_code.artifact_package_path + handler = local.service_config[each.key].handler + publish = true + runtime = "nodejs18.x" + timeout = 5 + role = aws_iam_role.this[0].arn + layers = [] + + tags = module.mw_urlrewrite_service_label[each.key].tags + + lifecycle { + create_before_destroy = true + } + + depends_on = [ + module.urlrewrite_service_code + ] +} + +resource "aws_lambda_permission" "urlrewrite_service_allow_cloudfront" { + for_each = aws_lambda_function.urlrewrite_service + + function_name = each.value.function_name + statement_id = "AllowExecutionFromCloudFront" + action = "lambda:GetFunction" + principal = "edgelambda.amazonaws.com" +} diff --git a/outputs.tf b/outputs.tf index 8b13789..db60a04 100755 --- a/outputs.tf +++ b/outputs.tf @@ -1 +1,104 @@ +output "auth_services" { + description = "Details of the created AWS Lambda functions for each of the auth services" + value = { + check_auth = { + enabled = local.service_config.check_auth.enabled + fn_arn = local.service_config.check_auth.enabled ? try("${aws_lambda_function.auth_service["check_auth"].arn}:${aws_lambda_function.auth_service["check_auth"].version}", "") : null + } + parse_auth = { + enabled = local.service_config.parse_auth.enabled + fn_arn = local.service_config.check_auth.enabled ? try("${aws_lambda_function.auth_service["parse_auth"].arn}:${aws_lambda_function.auth_service["parse_auth"].version}", "") : null + } + refresh_auth = { + enabled = local.service_config.refresh_auth.enabled + fn_arn = local.service_config.check_auth.enabled ? try("${aws_lambda_function.auth_service["refresh_auth"].arn}:${aws_lambda_function.auth_service["refresh_auth"].version}", "") : null + } + revoke_auth = { + enabled = local.service_config.revoke_auth.enabled + fn_arn = local.service_config.check_auth.enabled ? try("${aws_lambda_function.auth_service["revoke_auth"].arn}:${aws_lambda_function.auth_service["revoke_auth"].version}", "") : null + } + } + + depends_on = [ + aws_lambda_function.auth_service["check_auth"], + aws_lambda_function.auth_service["parse_auth"], + aws_lambda_function.auth_service["refresh_auth"], + aws_lambda_function.auth_service["revoke_auth"], + ] +} + +output "auth_routes" { + description = "Details of the created AWS Lambda functions for each of the auth services" + + value = local.auth_service_enabled ? [ + { + path_pattern = local.auth_service_config.redirectPathAuthSignIn + allowed_methods = ["GET", "HEAD"] + compress = true + cache_policy = try(data.aws_cloudfront_cache_policy.disabled[0].id) + origin_request_policy = try(data.aws_cloudfront_origin_request_policy.all[0].id) + response_headers_policy = try(data.aws_cloudfront_response_headers_policy.cors_preflight_hsts[0].id) + viewer_protocol_policy = "redirect-to-https" + + lambda_function_association = [{ + event_type = "viewer-request" + lambda_arn = try("${aws_lambda_function.auth_service["parse_auth"].arn}:${aws_lambda_function.auth_service["parse_auth"].version}", "") + include_body = false + }] + }, { + path_pattern = local.auth_service_config.redirectPathAuthRefresh + allowed_methods = ["GET", "HEAD"] + compress = true + cache_policy = try(data.aws_cloudfront_cache_policy.disabled[0].id) + origin_request_policy = try(data.aws_cloudfront_origin_request_policy.all[0].id) + response_headers_policy = try(data.aws_cloudfront_response_headers_policy.cors_preflight_hsts[0].id) + viewer_protocol_policy = "redirect-to-https" + + lambda_function_association = [{ + event_type = "viewer-request" + lambda_arn = try("${aws_lambda_function.auth_service["refresh_auth"].arn}:${aws_lambda_function.auth_service["refresh_auth"].version}", "") + include_body = false + }] + }, + { + path_pattern = local.auth_service_config.urlSignOut + allowed_methods = ["GET", "HEAD"] + compress = true + cache_policy = try(data.aws_cloudfront_cache_policy.disabled[0].id) + origin_request_policy = try(data.aws_cloudfront_origin_request_policy.all[0].id) + response_headers_policy = try(data.aws_cloudfront_response_headers_policy.cors_preflight_hsts[0].id) + viewer_protocol_policy = "redirect-to-https" + + lambda_function_association = [{ + event_type = "viewer-request" + lambda_arn = try("${aws_lambda_function.auth_service["revoke_auth"].arn}:${aws_lambda_function.auth_service["revoke_auth"].version}", "") + include_body = false + }] + } + ] : [] + + depends_on = [ + aws_lambda_function.auth_service["check_auth"], + aws_lambda_function.auth_service["parse_auth"], + aws_lambda_function.auth_service["refresh_auth"], + aws_lambda_function.auth_service["revoke_auth"], + ] +} + +output "urlrewrite_services" { + description = "Details of the created AWS Lambda functions for each of the auth services" + + value = { + rewrite_url = { + enabled = local.urlrewrite_service_enabled + fn_arn = local.urlrewrite_service_enabled ? try("${aws_lambda_function.urlrewrite_service["rewrite_url"].arn}:${aws_lambda_function.urlrewrite_service["rewrite_url"].version}", "") : null + fn_name = local.urlrewrite_service_enabled ? aws_lambda_function.urlrewrite_service["rewrite_url"].function_name : "" + fn_version = local.urlrewrite_service_enabled ? aws_lambda_function.urlrewrite_service["rewrite_url"].version : "" + } + } + + depends_on = [ + aws_lambda_function.urlrewrite_service["rewrite_url"], + ] +} diff --git a/variables.tf b/variables.tf index 8b13789..5c12d64 100755 --- a/variables.tf +++ b/variables.tf @@ -1 +1,49 @@ +variable "auth_service_config" { + description = "Configuration details for the authentication service" + type = object({ + enabled = optional(bool, true) + log_level = optional(string, "info") + aws_region = optional(string) + cognito_idp_arn = string + cognito_idp_domain = string + cognito_idp_jwks = object({ keys = list(map(string)) }) + cognito_idp_client_id = string + cognito_idp_client_secret = string + cognito_idp_client_scopes = list(string) + opa_policy_content = optional(string) + opa_policy_data = optional(map(string), {}) + }) +} +variable "urlrewrite_service_config" { + description = "Configuration details for the URL rewrite service" + type = object({ + enabled = optional(bool, false) + log_level = optional(string, "info") + aws_region = optional(string) + policy_content = optional(string, <<-EOF + package urlrewriter + result := [] + EOF + ) + }) + default = {} +} + +variable "destruction_delay" { + description = "Delay before destroying resources when they are deleted" + type = string + default = "20m" +} + +variable "aws_account_id" { + description = "The AWS account ID that the module will be deployed in" + type = string + default = "" +} + +variable "aws_region_name" { + description = "The AWS region name where the module will be deployed" + type = string + default = "" +}