From c32868a4b804bcc4c67cdda84e4a64bebe39204f Mon Sep 17 00:00:00 2001 From: Raymond Cheng Date: Thu, 27 Jul 2023 18:45:22 -0700 Subject: [PATCH] Initialize with frontend and indexer --- .eslintrc.json | 32 + .github/ISSUE_TEMPLATE/1.bug_report.yml | 37 + .github/ISSUE_TEMPLATE/2.feature_request.yml | 28 + .github/ISSUE_TEMPLATE/3.docs_request.yml | 24 + .github/ISSUE_TEMPLATE/9.other.yml | 8 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/workflows/ci-default.yml | 78 + .github/workflows/deploy-indexer.yml | 36 + .github/workflows/indexer-autocrawl.yml | 31 + .github/workflows/indexer-manual.yml | 43 + .gitignore | 46 + .husky/pre-commit | 4 + .lintstagedrc | 7 + .prettierignore | 42 + .prettierrc.json | 3 + CONTRIBUTING.md | 167 + LICENSE | 201 + README.md | 56 + frontend/.env.local.example | 7 + frontend/.gitignore | 35 + frontend/README.md | 29 + frontend/lib/config.ts | 19 + frontend/next.config.js | 10 + frontend/package.json | 48 + frontend/pages/[[...catchall]].tsx | 89 + frontend/pages/plasmic-host.tsx | 7 + frontend/plasmic-init.ts | 23 + frontend/tsconfig.json | 31 + indexer/.env.example | 14 + indexer/.gitignore | 13 + indexer/README.md | 90 + indexer/assets/os-observer.png | Bin 0 -> 43552 bytes indexer/assets/style.css | 11 + indexer/jest.config.ts | 24 + indexer/package.json | 64 + .../migration.sql | 100 + indexer/prisma/migrations/migration_lock.toml | 3 + indexer/prisma/schema.prisma | 168 + indexer/requirements.txt | 4 + indexer/src/__init__.py | 0 indexer/src/actions/autocrawl.ts | 54 + .../src/actions/github/fetch/issueClosed.ts | 87 + .../src/actions/github/fetch/issueFiled.ts | 87 + .../actions/github/fetchGithubIssues/index.ts | 96 + .../src/actions/github/fetchIssues/index.ts | 99 + .../upsertOrg/createEventPointersForOrg.ts | 31 + .../upsertOrg/createEventPointersForRepo.ts | 87 + indexer/src/actions/github/upsertOrg/index.ts | 60 + .../upsertOrg/upsertGithubReposForOrg.ts | 55 + indexer/src/api_demo.py | 198 + indexer/src/app.py | 347 + indexer/src/cli.ts | 117 + indexer/src/config.ts | 14 + indexer/src/database.py | 271 + indexer/src/db/prisma-client.ts | 114 + indexer/src/events/__init__.py | 0 indexer/src/events/funding_rounds.py | 98 + indexer/src/events/github.ts | 79 + indexer/src/events/github_events.py | 145 + indexer/src/events/github_user.py | 56 + indexer/src/events/graphql_queries.py | 177 + indexer/src/events/npm.ts | 319 + indexer/src/events/readme.md | 93 + indexer/src/events/zerion_scraper.py | 230 + indexer/src/fetchEvents.ts | 105 + indexer/src/index.ts | 2 + indexer/src/schema.sql | 36 + indexer/src/utils/api.ts | 29 + indexer/src/utils/common.ts | 114 + indexer/src/utils/error.ts | 39 + indexer/src/utils/getPath.ts | 49 + indexer/src/utils/github/getGithubPointer.ts | 64 + indexer/src/utils/github/getOrgRepos.ts | 75 + indexer/src/utils/github/getRepoIusses.ts | 136 + .../utils/github/getRepositoryCreatedAt.ts | 28 + indexer/src/utils/github/graphQLClient.ts | 8 + indexer/src/utils/github/unpaginate.ts | 68 + indexer/src/utils/logger.ts | 18 + indexer/src/utils/parsing.ts | 27 + indexer/src/validate_eth_address.py | 125 + indexer/src/validate_github_org.py | 44 + indexer/supabase/.gitignore | 3 + indexer/supabase/config.toml | 82 + indexer/supabase/seed.sql | 0 indexer/test/events/npm.test.ts | 87 + indexer/test/utils/parsing.test.ts | 44 + indexer/tsconfig.json | 18 + package.json | 43 + turbo.json | 29 + yarn.lock | 6382 +++++++++++++++++ 90 files changed, 12206 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .github/ISSUE_TEMPLATE/1.bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/2.feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/3.docs_request.yml create mode 100644 .github/ISSUE_TEMPLATE/9.other.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/ci-default.yml create mode 100644 .github/workflows/deploy-indexer.yml create mode 100644 .github/workflows/indexer-autocrawl.yml create mode 100644 .github/workflows/indexer-manual.yml create mode 100644 .gitignore create mode 100755 .husky/pre-commit create mode 100644 .lintstagedrc create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 frontend/.env.local.example create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/lib/config.ts create mode 100644 frontend/next.config.js create mode 100644 frontend/package.json create mode 100644 frontend/pages/[[...catchall]].tsx create mode 100644 frontend/pages/plasmic-host.tsx create mode 100644 frontend/plasmic-init.ts create mode 100644 frontend/tsconfig.json create mode 100644 indexer/.env.example create mode 100644 indexer/.gitignore create mode 100644 indexer/README.md create mode 100644 indexer/assets/os-observer.png create mode 100644 indexer/assets/style.css create mode 100644 indexer/jest.config.ts create mode 100644 indexer/package.json create mode 100644 indexer/prisma/migrations/20230602204356_create_tables/migration.sql create mode 100644 indexer/prisma/migrations/migration_lock.toml create mode 100644 indexer/prisma/schema.prisma create mode 100644 indexer/requirements.txt create mode 100644 indexer/src/__init__.py create mode 100644 indexer/src/actions/autocrawl.ts create mode 100644 indexer/src/actions/github/fetch/issueClosed.ts create mode 100644 indexer/src/actions/github/fetch/issueFiled.ts create mode 100644 indexer/src/actions/github/fetchGithubIssues/index.ts create mode 100644 indexer/src/actions/github/fetchIssues/index.ts create mode 100644 indexer/src/actions/github/upsertOrg/createEventPointersForOrg.ts create mode 100644 indexer/src/actions/github/upsertOrg/createEventPointersForRepo.ts create mode 100644 indexer/src/actions/github/upsertOrg/index.ts create mode 100644 indexer/src/actions/github/upsertOrg/upsertGithubReposForOrg.ts create mode 100644 indexer/src/api_demo.py create mode 100644 indexer/src/app.py create mode 100644 indexer/src/cli.ts create mode 100644 indexer/src/config.ts create mode 100644 indexer/src/database.py create mode 100644 indexer/src/db/prisma-client.ts create mode 100644 indexer/src/events/__init__.py create mode 100644 indexer/src/events/funding_rounds.py create mode 100644 indexer/src/events/github.ts create mode 100644 indexer/src/events/github_events.py create mode 100644 indexer/src/events/github_user.py create mode 100644 indexer/src/events/graphql_queries.py create mode 100644 indexer/src/events/npm.ts create mode 100644 indexer/src/events/readme.md create mode 100644 indexer/src/events/zerion_scraper.py create mode 100644 indexer/src/fetchEvents.ts create mode 100644 indexer/src/index.ts create mode 100644 indexer/src/schema.sql create mode 100644 indexer/src/utils/api.ts create mode 100644 indexer/src/utils/common.ts create mode 100644 indexer/src/utils/error.ts create mode 100644 indexer/src/utils/getPath.ts create mode 100644 indexer/src/utils/github/getGithubPointer.ts create mode 100644 indexer/src/utils/github/getOrgRepos.ts create mode 100644 indexer/src/utils/github/getRepoIusses.ts create mode 100644 indexer/src/utils/github/getRepositoryCreatedAt.ts create mode 100644 indexer/src/utils/github/graphQLClient.ts create mode 100644 indexer/src/utils/github/unpaginate.ts create mode 100644 indexer/src/utils/logger.ts create mode 100644 indexer/src/utils/parsing.ts create mode 100644 indexer/src/validate_eth_address.py create mode 100644 indexer/src/validate_github_org.py create mode 100644 indexer/supabase/.gitignore create mode 100644 indexer/supabase/config.toml create mode 100644 indexer/supabase/seed.sql create mode 100644 indexer/test/events/npm.test.ts create mode 100644 indexer/test/utils/parsing.test.ts create mode 100644 indexer/tsconfig.json create mode 100644 package.json create mode 100644 turbo.json create mode 100644 yarn.lock diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..c095592f0 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "next/core-web-vitals" + ], + "ignorePatterns": [ + "**/vendor/*.js", + "vendor/**/*.js" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["react", "@typescript-eslint"], + "rules": { + "react-hooks/exhaustive-deps": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }] + } +} diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml new file mode 100644 index 000000000..107b2a5bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -0,0 +1,37 @@ +name: Bug Report +description: Create a bug report +labels: ['type:bug'] +body: + - type: markdown + attributes: + value: If you leave out sections there is a high likelihood it will be moved to the [GitHub Discussions](https://github.com/hypercerts-org/oso/discussions). + - type: dropdown + attributes: + label: Which area(s) are affected? (leave empty if unsure) + multiple: true + options: + - 'Docs' + - 'Frontend' + - 'Indexer' + - 'Other' + - type: textarea + attributes: + label: To Reproduce + description: Steps to reproduce the behavior, please provide a clear description of how to reproduce the issue. Screenshots can be provided in the issue body below. + validations: + required: true + - type: textarea + attributes: + label: Describe the Bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: markdown + attributes: + value: Before posting the issue go through the steps you've written down to make sure the steps provided are detailed and clear. Contributors should be able to follow the steps provided in order to reproduce the bug. diff --git a/.github/ISSUE_TEMPLATE/2.feature_request.yml b/.github/ISSUE_TEMPLATE/2.feature_request.yml new file mode 100644 index 000000000..78d90f4bb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2.feature_request.yml @@ -0,0 +1,28 @@ +name: Feature Request +description: Create a feature request +labels: 'type:featurerequest' +body: + - type: markdown + attributes: + value: Thanks for taking the time to file a feature request! Please fill out this form as completely as possible. + - type: markdown + attributes: + value: Please first verify that your feature was not already discussed on GitHub. + - type: textarea + attributes: + label: Describe the feature you'd like to request + description: A clear and concise description of what you want and what your use case is. + validations: + required: true + - type: textarea + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/3.docs_request.yml b/.github/ISSUE_TEMPLATE/3.docs_request.yml new file mode 100644 index 000000000..948be8b03 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3.docs_request.yml @@ -0,0 +1,24 @@ +name: 'Docs Request' +description: A request to update or improve documentation +title: 'Docs: ' +labels: + - 'category:docs' +body: + - type: textarea + attributes: + label: What is the improvement or update you wish to see? + description: 'Example: I would like to see more examples of how to use the SDK to detect hypercert claim collisions.' + validations: + required: true + - type: textarea + attributes: + label: Is there any context that might help us understand? + description: A clear description of any added context that might help us understand. + validations: + required: true + - type: input + attributes: + label: Does the docs page already exist? Please link to it. + description: 'Example: https://hypercerts.org/docs/api-reference/' + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/9.other.yml b/.github/ISSUE_TEMPLATE/9.other.yml new file mode 100644 index 000000000..bac33a66d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/9.other.yml @@ -0,0 +1,8 @@ +name: 'Other' +description: For internal use only +body: + - type: textarea + attributes: + label: What is it? + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..26f777bcc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Ask a question + url: https://github.com/hypercerts-org/oso/discussions + about: Ask questions and discuss with other community members diff --git a/.github/workflows/ci-default.yml b/.github/workflows/ci-default.yml new file mode 100644 index 000000000..8c3fd8a2c --- /dev/null +++ b/.github/workflows/ci-default.yml @@ -0,0 +1,78 @@ +# NOTE: This name appears in GitHub's Checks API and in workflow's status badge. +name: ci-default +env: + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + NEXT_PUBLIC_DOMAIN: ${{ vars.NEXT_PUBLIC_DOMAIN }} + PLASMIC_PROJECT_ID: ${{ vars.PLASMIC_PROJECT_ID }} + PLASMIC_PROJECT_API_TOKEN: ${{ vars.PLASMIC_PROJECT_API_TOKEN }} + DOCKER_PLATFORM: "amd64" + +# Trigger the workflow when: +on: + # A push occurs to one of the matched branches. + push: + branches: + - main + # Or when a pull request event occurs for a pull request against one of the + # matched branches. + pull_request: + branches: + - main + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Cancel in progress jobs on new pushes. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint-and-test: + # NOTE: This name appears in GitHub's Checks API. + name: test + environment: testing + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + # Check out pull request's HEAD commit instead of the merge commit to + # prevent gitlint from failing due to too long commit message titles, + # e.g. "Merge 3e621938d65caaa67f8e35d145335d889d470fc8 into 19a39b2f66cd7a165082d1486b2f1eb36ec2354a". + ref: ${{ github.event.pull_request.head.sha }} + # Fetch all history so gitlint can check the relevant commits. + fetch-depth: "0" + - name: Set up Python 3 + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Set up Node.js 18 + uses: actions/setup-node@v3 + with: + node-version: "18.15.0" + cache: "yarn" + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly-87bc53fc6c874bd4c92d97ed180b949e3a36d78c + - name: Install + run: | + yarn install --immutable + # Always run this step so that all linting errors can be seen at once. + if: always() + - name: Build + run: | + yarn build + # Always run this step so that all linting errors can be seen at once. + if: always() + - name: Lint + run: | + yarn lint + # Always run this step so that all linting errors can be seen at once. + if: always() + - name: Test + run: | + yarn test + # Always run this step so that all linting errors can be seen at once. + if: always() diff --git a/.github/workflows/deploy-indexer.yml b/.github/workflows/deploy-indexer.yml new file mode 100644 index 000000000..adb3a57b9 --- /dev/null +++ b/.github/workflows/deploy-indexer.yml @@ -0,0 +1,36 @@ +# NOTE: This name appears in GitHub's Checks API and in workflow's status badge. +name: deploy-indexer +env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + +# Trigger the workflow when: +on: + # A push occurs to one of the matched branches. + push: + branches: + - main + paths: + - os-observer/prisma/** + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + deploy-os-observer: + # NOTE: This name appears in GitHub's Checks API. + name: deploy-indexer + environment: indexer + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Set up Node.js 18 + uses: actions/setup-node@v3 + with: + cache: "yarn" + node-version: "18.x" + - name: Install + run: yarn install --immutable + - name: Run migrations + run: yarn deploy:indexer diff --git a/.github/workflows/indexer-autocrawl.yml b/.github/workflows/indexer-autocrawl.yml new file mode 100644 index 000000000..5d328839d --- /dev/null +++ b/.github/workflows/indexer-autocrawl.yml @@ -0,0 +1,31 @@ +name: os-observer-autocrawl +env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + +# Trigger the workflow when: +on: + workflow_dispatch: + schedule: + # Every day at 14:00 UTC = 07:00 PDT + - cron: '0 14 * * *' + +jobs: + fetch-data: + # NOTE: This name appears in GitHub's Checks API. + name: fetch-data + environment: indexer + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Set up Node.js 18 + uses: actions/setup-node@v3 + with: + cache: "yarn" + node-version: "18.x" + - name: Install + run: yarn install --immutable + - name: Run + run: yarn start:indexer runAutocrawl diff --git a/.github/workflows/indexer-manual.yml b/.github/workflows/indexer-manual.yml new file mode 100644 index 000000000..60bcb340b --- /dev/null +++ b/.github/workflows/indexer-manual.yml @@ -0,0 +1,43 @@ +name: os-observer-manual +env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + +# Trigger the workflow when: +on: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + inputs: + command: + description: 'Command to run' + required: true + default: 'npmDownloads' + type: choice + options: + - "npmDownloads" + - "githubCommits" + args: + description: 'Arguments to pass to the command' + required: false + default: '' + type: string + +jobs: + fetch-data: + # NOTE: This name appears in GitHub's Checks API. + name: fetch-data + environment: indexer + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Set up Node.js 18 + uses: actions/setup-node@v3 + with: + cache: "yarn" + node-version: "18.x" + - name: Install + run: yarn install --immutable + - name: Run + run: yarn start:indexer ${{ inputs.command }} ${{ inputs.args }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f979d2fc2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +**/node_modules/ +.pnp/ +.pnp.* +npm-debug.log* +.pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions + +# testing +coverage/ +.eslintcache + +# builds +out/ +build/ +dist/ +.turbo/ +.next/ +.docusaurus/ + +# files +.DS_Store +*.pem +*.env +.env*.local +*.log +coverage.json + +# typescript +*.tsbuildinfo +next-env.d.ts +.idea/ +.vscode/ +graph/.test.subgraph.yaml + +# playwright +playwright-report/ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..75b237df2 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn format:staged diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 000000000..6742ec47e --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,7 @@ +{ + "**/*.{js,jsx,ts,tsx,sol}": [ + "eslint --ignore-path .gitignore", + "prettier --write" + ], + "**/*.{md,json}": ["prettier --write"] +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..2ec9d218e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +**/node_modules/ +.pnp/ +.pnp.* +npm-debug.log* +.pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions + +# testing +coverage/ +.eslintcache + +# builds +out/ +build/ +.turbo/ +.next/ +.docusaurus/ +.graphclient/ + +# files +.DS_Store +*.pem +*.env +.env*.local +*.log +coverage.json + +# typescript +*.tsbuildinfo +next-env.d.ts +.idea/ +.vscode/ \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..bf357fbbc --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "trailingComma": "all" +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..ab3bf8790 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,167 @@ +# Contributing Guidelines + +Thank you for your interest in contributing to Hypercerts! There are many ways to contribute, and this document should not be considered encompassing. + +If you have a general question on how to use and deploy our software, please read our [Documentation](https://hypercerts.org/docs/) or join our [Hypercerts community server on Discord](https://testnet.hypercerts.org/discord). + +For concrete feature requests and/or bug reports, please file an issue in this +repository as described below. + + + +#### Table of Contents + + + +[Feature Requests](#feature-requests) + +[Bug Reports](#bug-reports) + +[Development](#development) + +- [Building](#building) +- [Contributing Code](#contributing-code) +- [Contributing Documentation](#contributing-documentation) +- [Style Guides](#style-guides) + - [Git Commit Messages](#git-commit-messages) + - [Code Style Guide](#code-style-guide) + +## Feature Requests + +To request new functionality, there are two primary approaches that will be most effective at receiving input and making progress. + +If the feature is **small** - a change to a single piece of functionality, or an addition that can be expressed clearly and succinctly in a few sentences, then the most appropriate place to propose it is as a [new Feature request] in this repository. + +If the feature is **more complicated**, involves protocol changes, or has potential safety or performance implications, then consider writing a proposal in [GitHub discussions]. This will allow a structured review and commenting of the proposed changes. You should aim to get the proposal approved by maintainers before starting on implementation. + +_Note that the project's committers still have the final word on what is accepted into the project._ + + + +[new Feature request]: https://github.com/hypercerts-org/hypercerts/issues/new?assignees=&labels=type%3Afeaturerequest&projects=&template=2.feature_request.yml +[GitHub discussions]: https://github.com/hypercerts-org/hypercerts/discussions + + + +## Bug Reports + +Bugs are a reality for any software project. We can't fix what we don't know about. + +If you believe a bug report presents a security risk, please follow [responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) and report it directly to security@hypercerts.org instead of filing a public issue or posting it to a public forum. We will get back to you promptly. + +Otherwise, please, first search between [existing issues in our repository] and if the issue is not reported yet, [file a new one]. + + + +[existing issues in our repository]: https://github.com/hypercerts-org/hypercerts/issues +[file a new one]: https://github.com/hypercerts-org/hypercerts/issues/new?assignees=&labels=type%3Abug&projects=&template=1.bug_report.yml + + + +## Development + +### Building + +Our development environment is documented in our [README](https://github.com/hypercerts-org/hypercerts/blob/main/README.md). + +### Contributing Code + +- **File issues:** Please make sure to first file an issue (i.e. feature request, bug report) before you actually start work on something. + +- **Create branches:** If you have write permissions to the repository, you can create user-id prefixed branches (e.g. user/feature/foobar) in the main repository. Otherwise, fork the main repository and create your branches there. + + - Good habit: regularly rebase to the `HEAD` of `main` branch of the main repository to make sure you prevent nasty conflicts: + + ```bash + git rebase /main + ``` + + - Push your branch to GitHub regularly so others can see what you are working + on: + + ```bash + git push -u + ``` + + _Note that you are allowed to force push into your development branches._ + +- **Use draft pull requests for work-in-progress:** + + - The draft state signals that the code is not ready for review, but still gives a nice URL to track the ongoing work. + +- _main_ branch is protected and will require at least 1 code review approval from a code owner before it can be merged. + +- When coding, please follow these standard practices: + + - **Write tests:** Especially when fixing bugs, make a test so we know that we’ve fixed the bug and prevent it from reappearing in the future. + - **Logging:** Please follow the logging conventions in the rest of the code base. + - **Instrumentation:** Please following the instrumentation conventions in the rest of the code. + - Try to instrument anything that would be relevant to an operational protocol. + +- **Change Log:** Please write a change log fragment (e.g. in [SDK](sdk/RELEASE.md)) in the project if a `RELEASE.md` file exists. + +- **Documentation:** Please write documentation in the code as you go. If possible, also consider updating/augmenting the [developer documentation]. + +- **Check CI:** Don’t break the build! + + - Make sure all tests pass before submitting your pull request for review. + +- **Signal PR review:** + + - Mark the draft pull request as _Ready for review_. + - Please include good high-level descriptions of what the pull request does. + - The description should include references to all GitHub issues addressed by the pull request. Include the status ("done", "partially done", etc). + - Provide some details on how the code was tested. + - After you are nearing review (and definitely before merge) **squash commits into logical parts** (avoid squashing over merged commits, use rebase first!). Use proper commit messages which explain what was changed in the given commit and why. + +- **Get a code review:** + + - Code owners will be automatically assigned to review based on the files that were changed. + - You can generally look up the last few people to edit the file to get the best person to review. + - When addressing the review: Make sure to address all comments, and respond to them so that the reviewer knows what has happened (e.g. "done" or "acknowledged" or "I don't think so because ..."). + +- **Merge:** Once approved, the creator of the pull request should merge the branch, close the pull request, and delete the branch. If the creator does not have write access to the repository, one of the committers should do so instead. + +- **Signal to close issues:** Let the person who filed the issue close it. Ping them in a comment (e.g. @user) making sure you’ve commented how an issue was addressed. + - Anyone else with write permissions should be able to close the issue if not addressed within a week. + +[developer documentation]: https://github.com/hypercerts-org/hypercerts/tree/main/docs/docs + +### Contributing Documentation + +Documentation is always welcome! Documentation comes in several forms: + +- Code-level documentation, following language specifications. +- Developer and user documentation, which lives in `docs/`. + +### Style Guides + +#### Git Commit Messages + +We use [Conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). + +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +For example: + +``` +feat(api)!: send an email to the customer when a product is shipped + +* I did this +* and that +``` + +#### Code Style Guide + +We check for styles in 2 ways: + +1. For any code that can be automatically rewritten (e.g. prettier), we use pre-commit hooks with husky. +2. For anything else, we'll incorporate it into the CI build. + +Please use best practices and automated linting tools to keep the code fresh. diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 000000000..4d5ff3baa --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# oso [![License: Apache 2.0][license-badge]][license] [![Github Actions][gha-badge]][gha] + +[license]: https://opensource.org/license/apache-2-0/ +[license-badge]: https://img.shields.io/badge/License-Apache2.0-blue.svg +[gha]: https://github.com/hypercerts-org/oso/actions/workflows/ci-default.yml +[gha-badge]: https://github.com/hypercerts-org/oso/actions/workflows/ci-default.yml/badge.svg + +Open source observer is a tool for measuring the impact of open source software ecosystems. + +[www.opensource.observer](https://www.opensource.observer) + +## Organization + +- `/docs`: documentation (Docusaurus) + - [on Vercel](https://www.opensource.observer/docs) - Production build +- `/frontend`: frontend application (Next.js) + - [on Vercel](https://www.opensource.observer) - Production build +- `/indexer`: Data indexer + - [on GitHub actions](https://github.com/hypercerts-org/oso/actions/workflows/indexer-autocrawl.yml) + +## Quickstart + +### Setup and build the frontend + +First, make sure the environment variables are set for `./frontend`. +Take a look at `./frontend/.env.local.example` for the complete list. + +- You can either set these yourself (e.g. in CI/CD) +- or copy the file to `.env.local` and populate it. + +Then the do a turbo build of all apps, run the following: + +```bash +yarn install +yarn build +``` + +The resulting static site can be found in `./build/`. + +### Running the prod server + +If you've already run the build, you can use `yarn serve` to serve the built files + +### Running the frontend dev server + +To run a dev server that watches for changes across code and Plasmic, run: + +```bash +yarn dev:frontend +``` + +## Playbooks + +For setup and common operations for each subproject, navigate into the respective directory and check out the `README.md`. + +We also maintain a [playbook](https://hypercerts.org/docs/devops) for larger operations. diff --git a/frontend/.env.local.example b/frontend/.env.local.example new file mode 100644 index 000000000..6bd827e07 --- /dev/null +++ b/frontend/.env.local.example @@ -0,0 +1,7 @@ +############# +## App config +############# +### The domain that the application is hosted on +NEXT_PUBLIC_DOMAIN=www.opensource.observer +PLASMIC_PROJECT_ID= +PLASMIC_PROJECT_API_TOKEN= diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 000000000..8f322f0d8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 000000000..cda37a9d6 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,29 @@ +# Next.js Static Export + +Next.js enables starting as a static site or Single-Page Application (SPA), then later optionally upgrading to use features that require a server. + +When running `next build`, Next.js generates an HTML file per route. By breaking a strict SPA into individual HTML files, Next.js can avoid loading unnecessary JavaScript code on the client-side, reducing the bundle size and enabling faster page loads. + +Learn more: https://nextjs.org/docs/app/building-your-application/deploying/static-exports + +## Deploy your own + +Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example) or preview live with [StackBlitz](https://stackblitz.com/github/vercel/next.js/tree/canary/examples/with-static-export) + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/vercel/next.js/tree/canary/examples/with-static-export) + +## How to use + +Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example: + +```bash +npx create-next-app --example with-static-export with-static-export-app +``` + +```bash +yarn create next-app --example with-static-export with-static-export-app +``` + +```bash +pnpm create next-app --example with-static-export with-static-export-app +``` diff --git a/frontend/lib/config.ts b/frontend/lib/config.ts new file mode 100644 index 000000000..4a51dd74a --- /dev/null +++ b/frontend/lib/config.ts @@ -0,0 +1,19 @@ + +export const requireEnv = (value: string | undefined, identifier: string) => { + if (!value) { + throw new Error(`Required env var ${identifier} does not exist`); + } + return value; +}; + +/** +export const DOMAIN = requireEnv( + process.env.NEXT_PUBLIC_DOMAIN, + "NEXT_PUBLIC_DOMAIN", +); +**/ + +export const PLASMIC_PROJECT_ID = process.env.PLASMIC_PROJECT_ID ?? "MISSING"; +export const PLASMIC_PROJECT_API_TOKEN = + process.env.PLASMIC_PROJECT_API_TOKEN ?? "MISSING"; + diff --git a/frontend/next.config.js b/frontend/next.config.js new file mode 100644 index 000000000..3b07efd02 --- /dev/null +++ b/frontend/next.config.js @@ -0,0 +1,10 @@ +// @ts-check + +/** + * @type {import('next').NextConfig} + **/ +const nextConfig = { + output: 'export', +} + +module.exports = nextConfig diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 000000000..bf0b69b95 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,48 @@ +{ + "name": "@hypercerts-org/frontend", + "version": "0.1.0", + "license": "Apache-2.0", + "private": true, + "scripts": { + "build": "next build", + "deploy": "yarn build", + "dev": "next", + "lint": "tsc --noEmit && next lint && yarn lint:eslint", + "lint:eslint": "eslint --ignore-path ../.gitignore --ignore-path .gitignore --max-warnings 0 .", + "lint:prettier": "prettier --ignore-path ../.gitignore --ignore-path .gitignore --loglevel warn --check **/*.{js,jsx,ts,tsx,sol,md,json}", + "prestart": "yarn export", + "start": "serve out", + "test": "jest --ci --passWithNoTests", + "test:watch": "jest --watch" + }, + "dependencies": { + "@plasmicapp/loader-nextjs": "^1.0.302", + "add": "^2.0.6", + "next": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "serve": "^14.2.0", + "yarn": "^1.22.19" + }, + "devDependencies": { + "@testing-library/dom": "^9.3.1", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.4.3", + "@types/node": "^18.11.5", + "@types/papaparse": "^5.3.7", + "@types/qs": "^6.9.7", + "@types/react": "^18.2.17", + "@types/react-dom": "^18.2.7", + "@types/testing-library__jest-dom": "^5.14.9", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", + "eslint": "8.45.0", + "eslint-config-next": "13.4.12", + "eslint-config-prettier": "^8.9.0", + "eslint-config-react": "^1.1.7", + "jest": "^29.6.2", + "jest-environment-jsdom": "^29.6.2", + "typescript": "^5.1.6" + } +} diff --git a/frontend/pages/[[...catchall]].tsx b/frontend/pages/[[...catchall]].tsx new file mode 100644 index 000000000..3e8dbd0ed --- /dev/null +++ b/frontend/pages/[[...catchall]].tsx @@ -0,0 +1,89 @@ +import * as React from 'react'; +import { + PlasmicComponent, + ComponentRenderData, + PlasmicRootProvider, + extractPlasmicQueryData +} from '@plasmicapp/loader-nextjs'; +import { GetStaticPaths, GetStaticProps } from 'next'; +import Error from 'next/error'; +import { useRouter } from 'next/router'; +import { PLASMIC } from '../plasmic-init'; + +/** + * Use fetchPages() to fetch list of pages that have been created in Plasmic + */ +export const getStaticPaths: GetStaticPaths = async () => { + const pages = await PLASMIC.fetchPages(); + return { + paths: pages.map((page) => ({ + params: { catchall: page.path.substring(1).split('/') } + })), + //fallback: 'blocking' + fallback: false, + }; +}; + +/** + * For each page, pre-fetch the data we need to render it + */ +export const getStaticProps: GetStaticProps = async (context) => { + const { catchall } = context.params ?? {}; + + // Convert the catchall param into a path string + const plasmicPath = + typeof catchall === 'string' ? catchall : Array.isArray(catchall) ? `/${catchall.join('/')}` : '/'; + const plasmicData = await PLASMIC.maybeFetchComponentData(plasmicPath); + if (!plasmicData) { + // This is some non-Plasmic catch-all page + return { + props: {} + }; + } + + // This is a path that Plasmic knows about. + const pageMeta = plasmicData.entryCompMetas[0]; + + // Cache the necessary data fetched for the page. + const queryCache = await extractPlasmicQueryData( + + + + ); + + // Pass the data in as props. + return { + props: { plasmicData, queryCache }, + + // Using incremental static regeneration, will invalidate this page + // after 300s (no deploy webhooks needed) + //revalidate: 300 + }; +}; + +/** + * Actually render the page! + */ +export default function CatchallPage(props: { plasmicData?: ComponentRenderData; queryCache?: Record }) { + const { plasmicData, queryCache } = props; + const router = useRouter(); + if (!plasmicData || plasmicData.entryCompMetas.length === 0) { + return ; + } + const pageMeta = plasmicData.entryCompMetas[0]; + return ( + // Pass in the data fetched in getStaticProps as prefetchedData + + { + // pageMeta.displayName contains the name of the component you fetched. + } + + + ); +} diff --git a/frontend/pages/plasmic-host.tsx b/frontend/pages/plasmic-host.tsx new file mode 100644 index 000000000..ebd815452 --- /dev/null +++ b/frontend/pages/plasmic-host.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { PlasmicCanvasHost } from '@plasmicapp/loader-nextjs'; +import { PLASMIC } from '../plasmic-init'; + +export default function PlasmicHost() { + return PLASMIC && ; +} diff --git a/frontend/plasmic-init.ts b/frontend/plasmic-init.ts new file mode 100644 index 000000000..fb984b899 --- /dev/null +++ b/frontend/plasmic-init.ts @@ -0,0 +1,23 @@ +import { initPlasmicLoader } from "@plasmicapp/loader-nextjs"; +import { PLASMIC_PROJECT_ID, PLASMIC_PROJECT_API_TOKEN } from "./lib/config"; + +export const PLASMIC = initPlasmicLoader({ + projects: [ + { + id: PLASMIC_PROJECT_ID, + token: PLASMIC_PROJECT_API_TOKEN, + }, + ], + // Fetches the latest revisions, whether or not they were unpublished! + // Disable for production to ensure you render only published changes. + preview: false, +}); + +/** + * Plasmic component registration + * + * For more details see: + * https://docs.plasmic.app/learn/code-components-ref/ + */ + +//PLASMIC.registerComponent(ClientGrid, {...}); diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 000000000..6b334e246 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "next.config.js", + ".next/types/**/*.ts" + ], + "exclude": ["node_modules"] +} diff --git a/indexer/.env.example b/indexer/.env.example new file mode 100644 index 000000000..56daea0a0 --- /dev/null +++ b/indexer/.env.example @@ -0,0 +1,14 @@ +#.env + +## Database +DATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE +SUPABASE_URL=https://project_id.supabase.co +SUPABASE_KEY= + +## APIs +ALCHEMY_KEY= +ALCHEMY_KEY_OP= +ETHERSCAN_KEY= +ETHERSCAN_KEY_OP= +GITHUB_TOKEN= +OPENAI_API_KEY= \ No newline at end of file diff --git a/indexer/.gitignore b/indexer/.gitignore new file mode 100644 index 000000000..66b07cf21 --- /dev/null +++ b/indexer/.gitignore @@ -0,0 +1,13 @@ +# ignore local storage artifacts +.env +__pycache__/ +.DS_Store +.ipynb_checkpoints/ +*.log +*.ipynb +data/ +dist + +.envrc +.direnv +shell.nix \ No newline at end of file diff --git a/indexer/README.md b/indexer/README.md new file mode 100644 index 000000000..71da9cf3e --- /dev/null +++ b/indexer/README.md @@ -0,0 +1,90 @@ +# Indexer + +## Typescript + +### Setup + +Pre-requisites: + +- [Docker runtime](https://docs.docker.com/engine/install/) - for running a local Supabase instance + +Install your npm dependencies + +```bash +yarn install +``` + +It is recommended you test any code changes against a development Supabase instance first. +Please do not develop against the production database. +This script will run a local Supabase server as a background service using docker. + +```bash +yarn db:start +# yarn db:stop # to stop the background service +``` + +After starting the Supabase instance, you will get the URL and keys. +Copy `.env.example` to `.env` and populate the `DATABASE_URL`. + +> Note: It is also possible to create a new throwaway project on supabase.com and use that instead. + +### After pulling latest changes + +After running `git pull`, make sure to run any missing migrations to make sure your local database schema matches the codebase. + +```bash +yarn db:migrate +``` + +For more details on how to collaborate within a team with Prisma, see [here](https://www.prisma.io/docs/guides/migrate/developing-with-prisma-migrate/team-development) + +## Python + +### Setup + +1. Set environment variables in a `.env` file. You'll need API access credentials for Alchemy, Etherscan, Github, and Supabase. + +2. Install the requirements in the `requirements.txt` file. + +`$ pip install -r requirements.txt` + +### Adding projects + +Projects must be stored in a JSON with the following fields: + +- name +- description +- github_org + +A database of projects can then be initialized with the following command in `src/database.py`: + +`insert_projects_and_wallets_from_json("data/projects.json")` + +### Fetching Github events for a project + +Once the database of projects is created, you can trigger the script to gather Github events with the following command in `src/database.py`: + +`insert_all_events()` + +Don't forget to review constant settings for: + +``` +START, END = '2021-01-01T00:00:00Z', '2023-04-30T00:00:00Z' +QUERIES = ["merged PR", "issue", "created PR"] +``` + +Note: there is currently no detection of duplicate entries in the database, so be careful modifying these settings. + +### Fetching financial transactions linked to a project's Ethereum address + +The script uses Zerion to download all transaction data for a wallet address. + +`$ python src/zerion_scraper.py` + +It will store all of the CSV files in a local directory: + +`STORAGE_DIR = "data/temp"` + +Finally, these can be added to the events database through the following command in `src/database.py`: + +`insert_zerion_transactions()` diff --git a/indexer/assets/os-observer.png b/indexer/assets/os-observer.png new file mode 100644 index 0000000000000000000000000000000000000000..bf650d6cb2a63f8822d166a3a72b1ae4487640b0 GIT binary patch literal 43552 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 O_~>aFXjZ7(ME)PdGYoP7 literal 0 HcmV?d00001 diff --git a/indexer/assets/style.css b/indexer/assets/style.css new file mode 100644 index 000000000..f48fdde25 --- /dev/null +++ b/indexer/assets/style.css @@ -0,0 +1,11 @@ +.DateInput, .DateInput_1 { + border-radius: 4px 0 0 4px; + width: 40%; +} + +.DateInput_input, .DateInput_input_1 { + Height: 34px; + Width: 100%; + border-radius: inherit; + font-size: inherit; +} \ No newline at end of file diff --git a/indexer/jest.config.ts b/indexer/jest.config.ts new file mode 100644 index 000000000..6f49f172c --- /dev/null +++ b/indexer/jest.config.ts @@ -0,0 +1,24 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest/presets/js-with-ts-esm", + //testEnvironment: 'node', + rootDir: ".", + moduleDirectories: ["node_modules", "src"], + verbose: false, + resolver: "ts-jest-resolver", + moduleFileExtensions: ["js", "json", "ts"], + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, + testPathIgnorePatterns: ["/node_modules/", "/dist/"], + transform: { + // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` + // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` + "^.+\\.[tj]sx?$": [ + "ts-jest", + { + useESM: true, + }, + ], + }, +}; diff --git a/indexer/package.json b/indexer/package.json new file mode 100644 index 000000000..069d59592 --- /dev/null +++ b/indexer/package.json @@ -0,0 +1,64 @@ +{ + "name": "@hypercerts-org/indexer", + "version": "0.0.1", + "description": "Open source impact measurement", + "repository": "git@github.com:hypercerts-org/oso.git", + "author": "Hypercerts Foundation", + "license": "Apache-2.0", + "bin": "./dist/src/cli.js", + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "type": "module", + "files": [ + "dist", + "README.md", + "package.json" + ], + "engines": { + "node": ">=16" + }, + "scripts": { + "build": "prisma generate && tsc", + "db:migrate": "prisma migrate dev", + "db:start": "supabase start", + "db:stop": "supabase stop", + "deploy": "yarn db:migrate", + "dev": "tsc-watch --onSuccess \"node dist/index.js\"", + "lint": "tsc --noEmit && yarn lint:eslint && yarn lint:prettier", + "lint:eslint": "eslint --ignore-path ../.gitignore --max-warnings 0 --cache .", + "lint:prettier": "prettier --ignore-path ../.gitignore --loglevel warn --check **/*.ts", + "start": "ts-node --esm src/cli.ts", + "test": "NODE_OPTIONS=\"--no-warnings --experimental-vm-modules\" jest" + }, + "prisma": { + "schema": "prisma/schema.prisma" + }, + "keywords": [], + "devDependencies": { + "@types/lodash": "^4.14.196", + "@types/node": "^20.4.5", + "@types/npm-registry-fetch": "^8.0.4", + "jest": "^29.6.2", + "prettier": "^3.0.0", + "prisma": "^5.0.0", + "supabase": "^1.82.2", + "ts-jest": "^29.1.1", + "ts-jest-resolver": "^2.0.1", + "ts-node": "^10.9.1", + "tsc-watch": "^6.0.4", + "typescript": "^5.1.6" + }, + "dependencies": { + "@prisma/client": "^5.0.0", + "chalk": "^5.3.0", + "dayjs": "^1.11.9", + "dotenv": "^16.3.1", + "graphql": "^16.7.1", + "graphql-request": "^6.1.0", + "lodash": "^4.17.21", + "npm-registry-fetch": "^14.0.5", + "ts-adt": "^2.1.2", + "winston": "^3.10.0", + "yargs": "^17.7.2" + } +} diff --git a/indexer/prisma/migrations/20230602204356_create_tables/migration.sql b/indexer/prisma/migrations/20230602204356_create_tables/migration.sql new file mode 100644 index 000000000..c2cfea9af --- /dev/null +++ b/indexer/prisma/migrations/20230602204356_create_tables/migration.sql @@ -0,0 +1,100 @@ +-- CreateEnum +CREATE TYPE "EventType" AS ENUM ('FUNDING', 'PULL_REQUEST_CREATED', 'PULL_REQUEST_MERGED', 'COMMIT_CODE', 'ISSUE_FILED', 'ISSUE_CLOSED', 'DOWNSTREAM_DEPENDENCY_COUNT', 'UPSTREAM_DEPENDENCY_COUNT', 'DOWNLOADS', 'CONTRACT_INVOKED', 'USERS_INTERACTED'); + +-- CreateEnum +CREATE TYPE "ArtifactType" AS ENUM ('EOA_ADDRESS', 'SAFE_ADDRESS', 'CONTRACT_ADDRESS', 'GIT_REPOSITORY', 'NPM_PACKAGE'); + +-- CreateEnum +CREATE TYPE "ArtifactNamespace" AS ENUM ('ETHEREUM', 'OPTIMISM', 'GOERLI', 'GITHUB', 'GITLAB', 'NPM_REGISTRY'); + +-- CreateEnum +CREATE TYPE "ContributorNamespace" AS ENUM ('GITHUB_USER'); + +-- CreateTable +CREATE TABLE "Organization" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "name" TEXT NOT NULL, + "githubOrg" TEXT, + "description" TEXT, + + CONSTRAINT "Organization_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Artifact" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "organizationId" INTEGER, + "type" "ArtifactType" NOT NULL, + "namespace" "ArtifactNamespace" NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT, + "details" JSONB, + + CONSTRAINT "Artifact_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Contributor" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "name" TEXT NOT NULL, + "namespace" "ContributorNamespace" NOT NULL, + + CONSTRAINT "Contributor_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Event" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "artifactId" INTEGER NOT NULL, + "eventType" "EventType" NOT NULL, + "eventTime" TIMESTAMPTZ(3) NOT NULL, + "contributorId" INTEGER, + "amount" DOUBLE PRECISION NOT NULL, + "details" JSONB, + + CONSTRAINT "Event_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "EventSourcePointer" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "artifactId" INTEGER NOT NULL, + "eventType" "EventType" NOT NULL, + "queryCommand" TEXT NOT NULL, + "queryArgs" JSONB NOT NULL, + "pointer" JSONB NOT NULL, + "autocrawl" BOOLEAN, + + CONSTRAINT "EventSourcePointer_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Organization_githubOrg_key" ON "Organization"("githubOrg"); + +-- CreateIndex +CREATE UNIQUE INDEX "Artifact_type_namespace_name_key" ON "Artifact"("type", "namespace", "name"); + +-- CreateIndex +CREATE UNIQUE INDEX "EventSourcePointer_artifactId_eventType_key" ON "EventSourcePointer"("artifactId", "eventType"); + +-- AddForeignKey +ALTER TABLE "Artifact" ADD CONSTRAINT "Artifact_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Event" ADD CONSTRAINT "Event_artifactId_fkey" FOREIGN KEY ("artifactId") REFERENCES "Artifact"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Event" ADD CONSTRAINT "Event_contributorId_fkey" FOREIGN KEY ("contributorId") REFERENCES "Contributor"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "EventSourcePointer" ADD CONSTRAINT "EventSourcePointer_artifactId_fkey" FOREIGN KEY ("artifactId") REFERENCES "Artifact"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/indexer/prisma/migrations/migration_lock.toml b/indexer/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..fbffa92c2 --- /dev/null +++ b/indexer/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/indexer/prisma/schema.prisma b/indexer/prisma/schema.prisma new file mode 100644 index 000000000..9ce279b9d --- /dev/null +++ b/indexer/prisma/schema.prisma @@ -0,0 +1,168 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +// Used to track a group of people, who may be producing many artifacts +model Organization { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @db.Timestamptz(3) + updatedAt DateTime @updatedAt + + // Human-readable name for the organization + name String + // The GitHub organization slug (e.g "hypercerts-org") + githubOrg String? @unique + // Human-readable description for the organization + description String? + + // RELATIONS + // Associated artifacts + artifacts Artifact[] +} + +// A particular piece of work created by an organization +// TODO: if we really want to have separate tables for wallets, repositories, etc, we can turn this into a union type later +// https://dev.to/reggi/working-with-unions-within-prisma-nm6 +model Artifact { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @db.Timestamptz(3) + updatedAt DateTime @updatedAt + + // Relation to the Organization if one exists + organization Organization? @relation(fields: [organizationId], references: [id]) + organizationId Int? + + // The type of artifact + type ArtifactType + // The namespace of `name` + namespace ArtifactNamespace + // A unique identifier for this artifact within the namespace + name String + // An optional URL to learn more about this artifact + url String? + // Catch-all for other data we want to store + details Json? + + // RELATIONS + // Associated events + events Event[] + // Associated event source pointers + eventSourcePtrs EventSourcePointer[] + + // A combination of the type, namespace, and name must be unique + @@unique([type, namespace, name]) +} + +// Represents someone that is associated with an event +// e.g. a source of funding, a code contributor, etc. +model Contributor { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @db.Timestamptz(3) + updatedAt DateTime @updatedAt + + // Currently just an arbitrary string + name String + namespace ContributorNamespace + // TODO add more fields as necessary + + // RELATIONS + // Associated events + events Event[] +} + +// An event that happened to an artifact +// An event stream is identified by its (organization, artifact, eventType) +model Event { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @db.Timestamptz(3) + updatedAt DateTime @updatedAt + + // Relation to the Artifact + artifact Artifact @relation(fields: [artifactId], references: [id]) + artifactId Int + // Type of event + eventType EventType + // Time the event happened + eventTime DateTime @db.Timestamptz(3) + // Who is the source of the event? + // Relation to the Contributor + contributor Contributor? @relation(fields: [contributorId], references: [id]) + contributorId Int? + // Depending on the event type, this may reflect some count or amount + amount Float + // Catch-all for other data we want to store with the event + details Json? +} + +model EventSourcePointer { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @db.Timestamptz(3) + updatedAt DateTime @updatedAt + + // Relation to the Artifact + artifact Artifact @relation(fields: [artifactId], references: [id]) + artifactId Int + // Type of event + eventType EventType + + // Used to run a command to get data + queryCommand String + // Arguments to the query command + queryArgs Json + // The relevant pointer information on where we left off + pointer Json + // Should the we auto-crawl this source? + autocrawl Boolean? + + // This tuple must be unique! + @@unique([artifactId, eventType]) +} + +enum EventType { + // Financing events + FUNDING + // Source code management events + PULL_REQUEST_CREATED + PULL_REQUEST_MERGED + COMMIT_CODE + // Project management events + ISSUE_FILED + ISSUE_CLOSED + // Software dependency events + DOWNSTREAM_DEPENDENCY_COUNT + UPSTREAM_DEPENDENCY_COUNT + DOWNLOADS + // Usage events + CONTRACT_INVOKED + USERS_INTERACTED +} + +enum ArtifactType { + // On-chain artifacts + EOA_ADDRESS + SAFE_ADDRESS + CONTRACT_ADDRESS + // Software artifacts + GIT_REPOSITORY + NPM_PACKAGE +} + +enum ArtifactNamespace { + // Blockchains + ETHEREUM + OPTIMISM + GOERLI + // Software + GITHUB + GITLAB + NPM_REGISTRY +} + +enum ContributorNamespace { + GITHUB_USER +} diff --git a/indexer/requirements.txt b/indexer/requirements.txt new file mode 100644 index 000000000..0c48677a1 --- /dev/null +++ b/indexer/requirements.txt @@ -0,0 +1,4 @@ +pandas +python-dotenv +selenium +supabase \ No newline at end of file diff --git a/indexer/src/__init__.py b/indexer/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/indexer/src/actions/autocrawl.ts b/indexer/src/actions/autocrawl.ts new file mode 100644 index 000000000..9d27eb76a --- /dev/null +++ b/indexer/src/actions/autocrawl.ts @@ -0,0 +1,54 @@ +import { prisma } from "../db/prisma-client.js"; +import { ApiReturnType, CommonArgs } from "../utils/api.js"; +import { normalizeToObject } from "../utils/common.js"; +import { logger } from "../utils/logger.js"; +import { FETCHER_REGISTRY } from "../cli.js"; + +/** + * Entrypoint arguments + */ +export type RunAutocrawlArgs = CommonArgs; + +export async function runAutocrawl(_args: RunAutocrawlArgs): Promise { + // Get all pointers marked for autocrawl + const pointers = await prisma.eventSourcePointer.findMany({ + where: { + autocrawl: true, + }, + }); + + // Iterate over pointers and call the appropriate function + const summarize = async ( + queryCommand: string, + queryArgs: any, + p: Promise, + ) => { + const result = await p; + return { + queryCommand, + queryArgs, + ...result, + }; + }; + const promises = pointers.map(async (evtSrcPtr) => { + const { queryCommand, queryArgs } = evtSrcPtr; + logger.info( + `Running autocrawl for ${queryCommand} with args ${JSON.stringify( + queryArgs, + )}`, + ); + const action = FETCHER_REGISTRY.find((f) => f.command === queryCommand); + if (!action) { + logger.warn(`Unknown queryCommand: ${queryCommand}`); + return; + } + return summarize( + queryCommand, + queryArgs, + action.func(normalizeToObject(queryArgs)), + ); + }); + + // Go do it + console.log(await Promise.all(promises)); +} diff --git a/indexer/src/actions/github/fetch/issueClosed.ts b/indexer/src/actions/github/fetch/issueClosed.ts new file mode 100644 index 000000000..7a4e9e2bb --- /dev/null +++ b/indexer/src/actions/github/fetch/issueClosed.ts @@ -0,0 +1,87 @@ +import { + EventSourceFunction, + ApiInterface, + ApiReturnType, + CommonArgs, +} from "../../../utils/api.js"; + +import { EventType, Prisma } from "@prisma/client"; +import { insertData } from "../../../db/prisma-client.js"; +import { GithubEventPointer } from "../upsertOrg/createEventPointersForRepo.js"; +import { + formatGithubDate, + getRepoIssuesClosed, +} from "../../../utils/github/getRepoIusses.js"; +import { getGithubPointer } from "../../../utils/github/getGithubPointer.js"; + +export interface GithubApiInterface extends ApiInterface { + eventType: EventType; +} + +const githubIssueClosed: EventSourceFunction = async ( + args: GithubFetchArgs, +): Promise => { + const [dbArtifact, pointer] = await getGithubPointer( + args, + EventType.ISSUE_CLOSED, + ); + + const startDate = new Date(Date.parse(pointer.lastFetch)); + + const currentDate = new Date(); + + const issues = await getRepoIssuesClosed( + `${args.org}/${args.repo}`, + startDate, + currentDate, + ); + + const dbIssues: Prisma.EventCreateManyInput[] = issues.map((issue) => { + return { + artifactId: dbArtifact.id, + eventTime: issue.closedAt as any, + eventType: EventType.ISSUE_CLOSED, + amount: 0, + details: { + url: issue.url, + login: issue.author.login, + }, + contributorId: 2, + }; + }); + + const newPointerData: GithubEventPointer = { + lastFetch: formatGithubDate(currentDate), + }; + + // Populate the database + await insertData( + dbArtifact.id, + EventType.ISSUE_CLOSED, + dbIssues, + pointer as any, + newPointerData as any, + GITHUB_ISSUE_CLOSED_COMMAND, + args, + true, + ); + + return { + _type: "upToDate", + cached: true, + }; +}; + +export type GithubFetchArgs = Partial< + CommonArgs & { + org: string; + repo: string; + } +>; + +export const GITHUB_ISSUE_CLOSED_COMMAND = "githubIssueClosed"; +export const GithubIssueClosedInterface: GithubApiInterface = { + command: GITHUB_ISSUE_CLOSED_COMMAND, + func: githubIssueClosed, + eventType: EventType.ISSUE_CLOSED, +}; diff --git a/indexer/src/actions/github/fetch/issueFiled.ts b/indexer/src/actions/github/fetch/issueFiled.ts new file mode 100644 index 000000000..fcc5d4fd9 --- /dev/null +++ b/indexer/src/actions/github/fetch/issueFiled.ts @@ -0,0 +1,87 @@ +import { + EventSourceFunction, + ApiInterface, + ApiReturnType, + CommonArgs, +} from "../../../utils/api.js"; + +import { EventType, Prisma } from "@prisma/client"; +import { insertData } from "../../../db/prisma-client.js"; +import { GithubEventPointer } from "../upsertOrg/createEventPointersForRepo.js"; +import { + formatGithubDate, + getRepoIssuesFiled, +} from "../../../utils/github/getRepoIusses.js"; +import { getGithubPointer } from "../../../utils/github/getGithubPointer.js"; + +export interface GithubApiInterface extends ApiInterface { + eventType: EventType; +} + +const githubIssueFiled: EventSourceFunction = async ( + args: GithubFetchArgs, +): Promise => { + const [dbArtifact, pointer] = await getGithubPointer( + args, + EventType.ISSUE_FILED, + ); + + const startDate = new Date(Date.parse(pointer.lastFetch)); + + const currentDate = new Date(); + + const issues = await getRepoIssuesFiled( + `${args.org}/${args.repo}`, + startDate, + currentDate, + ); + + const dbIssues: Prisma.EventCreateManyInput[] = issues.map((issue) => { + return { + artifactId: dbArtifact.id, + eventTime: issue.createdAt, + eventType: EventType.ISSUE_FILED, + amount: 0, + details: { + url: issue.url, + login: issue.author.login, + }, + contributorId: 2, + }; + }); + + const newPointerData: GithubEventPointer = { + lastFetch: formatGithubDate(currentDate), + }; + + // Populate the database + await insertData( + dbArtifact.id, + EventType.ISSUE_FILED, + dbIssues, + pointer as any, + newPointerData as any, + GITHUB_COMMITS_COMMAND, + args, + true, + ); + + return { + _type: "upToDate", + cached: true, + }; +}; + +export type GithubFetchArgs = Partial< + CommonArgs & { + org: string; + repo: string; + } +>; + +export const GITHUB_COMMITS_COMMAND = "githubIssueFiled"; +export const GithubIssueFiledInterface: GithubApiInterface = { + command: GITHUB_COMMITS_COMMAND, + func: githubIssueFiled, + eventType: EventType.ISSUE_FILED, +}; diff --git a/indexer/src/actions/github/fetchGithubIssues/index.ts b/indexer/src/actions/github/fetchGithubIssues/index.ts new file mode 100644 index 000000000..d52e15f2e --- /dev/null +++ b/indexer/src/actions/github/fetchGithubIssues/index.ts @@ -0,0 +1,96 @@ +// import { +// Artifact, +// ArtifactNamespace, +// ArtifactType, +// EventSourcePointer, +// EventType, +// Prisma, +// } from "@prisma/client"; +// import { prisma } from "../../../db/prisma-client.js"; +// import { +// getNameAndOwnerFromUrl, +// GithubEventPointer, +// } from "../upsertOrg/createEventPointersForRepo.js"; +// import { formatGithubDate, getRepoIssues } from "./getRepoIusses.js"; + +// export async function fetchGithubIssues( +// repo: Artifact, +// pointer: EventSourcePointer, +// ) { +// if ( +// repo.type != ArtifactType.GIT_REPOSITORY || +// repo.namespace != ArtifactNamespace.GITHUB +// ) { +// throw new Error( +// `Artifact is is not a repository on github. id: ${repo.id}, type: ${repo.type}, namespace: ${repo.namespace}`, +// ); +// } + +// if (!repo.url) { +// throw new Error(`Github repository artifact has no URL. id: ${repo.id}`); +// } + +// if ( +// pointer.eventType != EventType.ISSUE_FILED && +// pointer.eventType != EventType.ISSUE_CLOSED +// ) { +// throw new Error( +// `Wrong eventEvent type for pointer, expected ISSUE_FILED or ISSUE_CLOSED found ${pointer.eventType}`, +// ); +// } + +// if (pointer.artifactId != repo.id) { +// throw new Error( +// `artifact.id does not match pointer.artifactId. artifact.id: ${repo.id}, pointer.artifactId: ${pointer.artifactId}`, +// ); +// } + +// if (!pointer.pointer) { +// throw new Error(`Pointer data is falsy`); +// } + +// const pointerData: GithubEventPointer = pointer.pointer as any; +// const startDate = new Date(Date.parse(pointerData.lastFetch)); + +// const [owner, name] = getNameAndOwnerFromUrl(repo.url); + +// const currentDate = new Date(); + +// const issues = await getRepoIssues( +// `${owner}/${name}`, +// startDate, +// currentDate, +// ); + +// const newIssues: Prisma.EventCreateManyInput[] = issues.map((issue) => { +// return { +// artifactId: repo.id, +// eventTime: issue.createdAt, +// eventType: EventType.ISSUE_FILED, +// amount: 0, +// details: { +// url: issue.url, +// login: issue.author.login, +// }, +// contributorId: 2, +// }; +// }); + +// await prisma.$transaction([ +// prisma.event.createMany({ data: newIssues }), +// prisma.eventSourcePointer.update({ +// where: { +// id: pointer.id, +// }, +// data: { +// pointer: { +// lastFetch: formatGithubDate(currentDate), +// }, +// }, +// }), +// ]); + +// console.log( +// `Added ${newIssues.length} ISSUE_FILED events for ${owner}/${name}`, +// ); +// } diff --git a/indexer/src/actions/github/fetchIssues/index.ts b/indexer/src/actions/github/fetchIssues/index.ts new file mode 100644 index 000000000..b7376e5c1 --- /dev/null +++ b/indexer/src/actions/github/fetchIssues/index.ts @@ -0,0 +1,99 @@ +import { + Artifact, + ArtifactNamespace, + ArtifactType, + EventSourcePointer, + EventType, + Prisma, +} from "@prisma/client"; +import { prisma } from "../../../db/prisma-client.js"; +import { + getNameAndOwnerFromUrl, + GithubEventPointer, +} from "../upsertOrg/createEventPointersForRepo.js"; +import { + formatGithubDate, + getRepoIssuesFiled, +} from "../../../utils/github/getRepoIusses.js"; + +export async function fetchGithubIssues( + repo: Artifact, + pointer: EventSourcePointer, +) { + if ( + repo.type != ArtifactType.GIT_REPOSITORY || + repo.namespace != ArtifactNamespace.GITHUB + ) { + throw new Error( + `Artifact is is not a repository on github. id: ${repo.id}, type: ${repo.type}, namespace: ${repo.namespace}`, + ); + } + + if (!repo.url) { + throw new Error(`Github repository artifact has no URL. id: ${repo.id}`); + } + + if ( + pointer.eventType != EventType.ISSUE_FILED && + pointer.eventType != EventType.ISSUE_CLOSED + ) { + throw new Error( + `Wrong eventEvent type for pointer, expected ISSUE_FILED or ISSUE_CLOSED found ${pointer.eventType}`, + ); + } + + if (pointer.artifactId != repo.id) { + throw new Error( + `artifact.id does not match pointer.artifactId. artifact.id: ${repo.id}, pointer.artifactId: ${pointer.artifactId}`, + ); + } + + if (!pointer.pointer) { + throw new Error(`Pointer data is falsy`); + } + + const pointerData: GithubEventPointer = pointer.pointer as any; + const startDate = new Date(Date.parse(pointerData.lastFetch)); + + const [owner, name] = getNameAndOwnerFromUrl(repo.url); + + const currentDate = new Date(); + + const issues = await getRepoIssuesFiled( + `${owner}/${name}`, + startDate, + currentDate, + ); + + const newIssues: Prisma.EventCreateManyInput[] = issues.map((issue) => { + return { + artifactId: repo.id, + eventTime: issue.createdAt, + eventType: EventType.ISSUE_FILED, + amount: 0, + details: { + url: issue.url, + login: issue.author.login, + }, + contributorId: 2, + }; + }); + + await prisma.$transaction([ + prisma.event.createMany({ data: newIssues }), + prisma.eventSourcePointer.update({ + where: { + id: pointer.id, + }, + data: { + pointer: { + lastFetch: formatGithubDate(currentDate), + }, + }, + }), + ]); + + console.log( + `Added ${newIssues.length} ISSUE_FILED events for ${owner}/${name}`, + ); +} diff --git a/indexer/src/actions/github/upsertOrg/createEventPointersForOrg.ts b/indexer/src/actions/github/upsertOrg/createEventPointersForOrg.ts new file mode 100644 index 000000000..9a62ff669 --- /dev/null +++ b/indexer/src/actions/github/upsertOrg/createEventPointersForOrg.ts @@ -0,0 +1,31 @@ +import { + ArtifactNamespace, + ArtifactType, + Organization, + PrismaClient, +} from "@prisma/client"; +import { createEventPointersForRepo } from "./createEventPointersForRepo.js"; + +export async function createEventPointersForOrg(org: Organization) { + const prisma = new PrismaClient(); + + const orgRepos = await prisma.artifact.findMany({ + where: { + AND: [ + { + organizationId: org.id, + }, + { + type: ArtifactType.GIT_REPOSITORY, + }, + { + namespace: ArtifactNamespace.GITHUB, + }, + ], + }, + }); + + for (const orgRepo of orgRepos) { + await createEventPointersForRepo(orgRepo); + } +} diff --git a/indexer/src/actions/github/upsertOrg/createEventPointersForRepo.ts b/indexer/src/actions/github/upsertOrg/createEventPointersForRepo.ts new file mode 100644 index 000000000..d7dc85ac1 --- /dev/null +++ b/indexer/src/actions/github/upsertOrg/createEventPointersForRepo.ts @@ -0,0 +1,87 @@ +import { + ArtifactNamespace, + ArtifactType, + PrismaClient, + Prisma, + Artifact, +} from "@prisma/client"; +import { getRepositoryCreatedAt } from "../../../utils/github/getRepositoryCreatedAt.js"; +import { GithubIssueClosedInterface } from "../fetch/issueClosed.js"; +import { GithubIssueFiledInterface } from "../fetch/issueFiled.js"; + +export function getNameAndOwnerFromUrl( + githubUrl: string, +): [owner: string, name: string] { + const prefix = "https://github.com/"; + + const [owner, name] = githubUrl.slice(prefix.length).split("/"); + return [owner, name]; +} + +export async function createEventPointersForRepo(repo: Artifact) { + const prisma = new PrismaClient(); + + if ( + repo.type != ArtifactType.GIT_REPOSITORY || + repo.namespace != ArtifactNamespace.GITHUB + ) { + throw new Error( + `Artifact is is not a repository on github. id: ${repo.id}, type: ${repo.type}, namespace: ${repo.namespace}`, + ); + } + + if (!repo.url) { + throw new Error(`Github repository artifact has no URL. id: ${repo.id}`); + } + + const [owner, name] = getNameAndOwnerFromUrl(repo.url); + + const repoCreatedAt = await getRepositoryCreatedAt(owner, name); + + const eventSources = await prisma.eventSourcePointer.findMany({ + where: { artifactId: repo.id }, + }); + const githubRepoEvents = [ + GithubIssueFiledInterface, + GithubIssueClosedInterface, + ]; + + const missingEventSources = githubRepoEvents.filter( + (eventInterface) => + !eventSources.some( + (eventSource) => eventSource.eventType == eventInterface.eventType, + ), + ); + + const pointer: GithubEventPointer = { + lastFetch: repoCreatedAt, + }; + + const newEventSources: Prisma.EventSourcePointerCreateManyInput[] = + missingEventSources.map((eventInterface) => { + const queryArgs = { + org: owner, + repo: repo.name, + }; + + return { + artifactId: repo.id, + eventType: eventInterface.eventType, + pointer: pointer as unknown as Prisma.JsonObject, + queryCommand: eventInterface.command, + queryArgs: queryArgs as unknown as Prisma.JsonObject, + }; + }); + + console.log( + `created ${newEventSources.length} event sources for github repo ${owner}/${name}`, + ); + + await prisma.eventSourcePointer.createMany({ + data: newEventSources, + }); +} + +export interface GithubEventPointer { + lastFetch: string; +} diff --git a/indexer/src/actions/github/upsertOrg/index.ts b/indexer/src/actions/github/upsertOrg/index.ts new file mode 100644 index 000000000..922d4f451 --- /dev/null +++ b/indexer/src/actions/github/upsertOrg/index.ts @@ -0,0 +1,60 @@ +import { PrismaClient } from "@prisma/client"; +import { ApiInterface, ApiReturnType, CommonArgs } from "../../../utils/api.js"; +import { InvalidInputError } from "../../../utils/error.js"; +import { createEventPointersForOrg } from "./createEventPointersForOrg.js"; +import { fetchGithubReposForOrg as upsertGithubReposForOrg } from "./upsertGithubReposForOrg.js"; + +export async function upsertGithubOrg( + args: UpsertGithubOrgArgs, +): Promise { + if (!args.orgName) { + throw new InvalidInputError("Missing required argument: orgName"); + } + + const prisma = new PrismaClient(); + let org = await prisma.organization.findFirst({ + where: { + AND: [ + { + name: args.orgName, + }, + { + githubOrg: args.orgName, + }, + ], + }, + }); + + if (org) { + console.log(`Found existing org with id '${org.id}'`); + } else { + org = await prisma.organization.create({ + data: { + name: args.orgName, + githubOrg: args.orgName, + }, + }); + + console.log(`No existing org found, created a new org with id '${org.id}'`); + } + + await upsertGithubReposForOrg(org); + await createEventPointersForOrg(org); + + return { + _type: "upToDate", + cached: true, + }; +} + +export type UpsertGithubOrgArgs = Partial< + CommonArgs & { + orgName: string; + } +>; + +export const UPSERT_GITHUB_ORG_COMMAND = "upsertGithubOrg"; +export const UpsertGithubOrgInterface: ApiInterface = { + command: UPSERT_GITHUB_ORG_COMMAND, + func: upsertGithubOrg, +}; diff --git a/indexer/src/actions/github/upsertOrg/upsertGithubReposForOrg.ts b/indexer/src/actions/github/upsertOrg/upsertGithubReposForOrg.ts new file mode 100644 index 000000000..c5bb5939e --- /dev/null +++ b/indexer/src/actions/github/upsertOrg/upsertGithubReposForOrg.ts @@ -0,0 +1,55 @@ +import { + PrismaClient, + Prisma, + ArtifactType, + ArtifactNamespace, + Organization, +} from "@prisma/client"; + +import { getOrgRepos } from "../../../utils/github/getOrgRepos.js"; + +export async function fetchGithubReposForOrg(org: Organization) { + const prisma = new PrismaClient(); + + if (!org.githubOrg) { + throw new Error( + `Org has no githubOrg string so cannot be used as a Github Org. org.id: ${org.id}`, + ); + } + + const existingArtifacts = await prisma.artifact.findMany({ + where: { + organizationId: org.id, + }, + }); + + const repos = await getOrgRepos(org.githubOrg); + const newRepos = repos.filter( + (repo) => + !existingArtifacts.some( + (artifact) => artifact.url && artifact.url == repo.url, + ), + ); + + const newArtifacts: Prisma.ArtifactCreateManyInput[] = newRepos.map( + (repo) => { + return { + organizationId: org.id, + type: ArtifactType.GIT_REPOSITORY, + namespace: ArtifactNamespace.GITHUB, + name: repo.name, + url: repo.url, + }; + }, + ); + + await prisma.artifact.createMany({ + data: newArtifacts, + }); + + console.log( + `Created ${newRepos.length} new github repository artifacts for ${org.name}`, + ); +} + +// NOTE: github org names might not be case sensitive diff --git a/indexer/src/api_demo.py b/indexer/src/api_demo.py new file mode 100644 index 000000000..8897d6793 --- /dev/null +++ b/indexer/src/api_demo.py @@ -0,0 +1,198 @@ +from collections import Counter +from datetime import date +from dotenv import load_dotenv +import json +import os +import random + +from supabase import create_client, Client + + +# ---------------------- DATABASE SETUP -------------------------------------- # + +def supabase_client() -> Client: + load_dotenv() + url = os.environ.get("SUPABASE_URL") + key = os.environ.get("SUPABASE_KEY") + return create_client(url, key) + +supabase = supabase_client() + + +#----------------------- GLOBALS ----------------------------------------------# + +PROJECT_LIST = [ + "ffc69c6c-dbd1-4077-9dc7-1b8be4a7315e", + "f5a2f3d4-5052-4f21-9017-a1d0ae8cb943", + "de43bcbb-612a-4ed7-b493-244a7c6483ff", + # "e4b43fa9-b807-45f4-93dd-0c523ade875f", + # "4c6b108c-0c75-49e9-8371-8b5613fe1973", + # "bc695037-a1d1-400e-b495-18097bb0c66b", + # "478a9fad-0453-4f16-aa40-4aea390f8462", + # "f2727f30-1c71-4611-9c4e-917d22b546ba", + # "beb3c122-a747-4328-8435-19d6e770609f", + # "37c6e041-ecf3-45d6-ab26-339c1efcbb25", + # "7a697c14-9953-4b09-8572-452fbe7e0d1c", + # "f16842de-4118-4d92-921f-075c6dedca1e", + # "c6789276-497a-451d-a8b5-17e684251eb6", + # "f7370593-7f26-43ee-bce8-da1badf58f8b" +] + +DEFAULT_START_DATE = date(2023, 1, 1) +DEFAULT_END_DATE = date(2023, 5, 26) + + +#----------------------- DATA FETCHES ------------------------------------------# + +def get_project_mapping(): + + response = (supabase + .table('projects') + .select('id, name, github_org, description') + .order('name') + .execute()) + + mapping = { + project['id']: { + 'name': project['name'], + 'github': project['github_org'], + 'description': project['description'] + } + for project in response.data + if project['id'] in PROJECT_LIST + } + mapping = dict(sorted(mapping.items(), key=lambda x: x[1]['name'].lower())) + + return mapping + +PROJECT_MAPPING = get_project_mapping() + + +def get_events_from_project(project_id, start_date, end_date): + + response = (supabase + .table('events') + .select('*') + .eq('project_id', project_id) + .gte('event_time', start_date) + .lte('event_time', end_date) + .execute()) + + return response.data + + +def analyze_events(events, min_contribs=1): + + project = PROJECT_MAPPING.get(events[0]['project_id']) + github_org = project.get('github') + + github_events = [] + onchain_events = [] + for e in events: + source = e['details']['source'] + if source == 'github': + github_events.append({ + 'github_org': github_org, + 'repo': e['details']['data']['repository.name'], + 'contributor': e['contributor'], + 'event_type': e['event_type'], + 'amount': e['amount'], + 'timestamp': e['event_time'] + }) + elif source == 'zerion': + onchain_events.append({ + 'event_type': e['event_type'], + 'buy_address': e['details']['data']['Buy Currency Address'], + 'sell_address': e['details']['data']['Sell Currency Address'], + 'amount': e['amount'], + 'timestamp': e['event_time'] + }) + else: + continue + + if min_contribs > 1: + contrib_counts = Counter([e['contributor'] for e in github_events]) + github_events = [ + e for e in github_events + if contrib_counts[e['contributor']] > min_contribs + ] + + return { + 'project': project, + 'github_events': github_events, + 'onchain_events': onchain_events + } + + +#----------------------- ANALYSIS ----------------------------------------------# + + +def generate_kpis(events_dict): + + project = events_dict['project'] + github_org = project.get('github') + project_name = project.get('name') + + git_events = events_dict['github_events'] + contrib_counts = Counter([e['contributor'] for e in git_events]) + repo_counts = Counter(e['repo'] for e in git_events) + event_counts = Counter(e['event_type'] for e in git_events) + + first_date = min([e['timestamp'] for e in git_events]) + last_date = max([e['timestamp'] for e in git_events]) + + income = sum([ + e['amount'] for e in events_dict['onchain_events'] + if e['event_type'] == "funds received" + ]) + + # dummy figures + num_users = random.randint(1000,20000) + + return { + "project": { + "name": project_name, + "status": "verified", + "start_period": first_date, + "end_period": last_date, + + # these are dummy figures + "smart_contracts_monitored": random.randint(1,10), + "project_wallets_monitored": random.randint(1,5) + }, + "metrics": { + "github_contributors_count": len(contrib_counts), + "github_contributions_count": len(git_events), + "github_active_repos_count": len(repo_counts), + "onchain_income": f"${income:,.0f}", + + # these are dummy figures + "contract_interactions_count": random.randint(20,65000), + "unique_onchain_users": num_users, + "active_onchain_users": int(num_users * random.uniform(.05,.5)) + } + } + + +def sample_api_call(project_ids=PROJECT_LIST): + + data = [] + for project_id in project_ids: + events = get_events_from_project(project_id, DEFAULT_START_DATE, DEFAULT_END_DATE) + events_dict = analyze_events(events) + kpis = generate_kpis(events_dict) + data.append(kpis) + + result = { + "success": True, + "message": "query excecuted successfully", + "data": data + } + + pretty_result = json.dumps(result, indent=2) + print(pretty_result) + + return result + +if __name__ == '__main__': + sample_api_call() diff --git a/indexer/src/app.py b/indexer/src/app.py new file mode 100644 index 000000000..41753e7a3 --- /dev/null +++ b/indexer/src/app.py @@ -0,0 +1,347 @@ +#----------------------- STANDARD DASH DEPENDENCIES ---------------------------# + +import dash +from dash import dcc, html +import dash_bootstrap_components as dbc +from dash.dependencies import Input, Output +from dash.exceptions import PreventUpdate + +#----------------------- THIS APP'S DEPENDENCIES ------------------------------# + +from collections import Counter +from datetime import date +import pandas as pd +import plotly.express as px +import random + +from dotenv import load_dotenv +import os +from supabase import create_client, Client + + +# ---------------------- DATABASE SETUP -------------------------------------- # + +def supabase_client() -> Client: + load_dotenv() + url = os.environ.get("SUPABASE_URL") + key = os.environ.get("SUPABASE_KEY") + return create_client(url, key) + +supabase = supabase_client() + + +#----------------------- GLOBALS ----------------------------------------------# + +PROJECT_LIST = [ + "ffc69c6c-dbd1-4077-9dc7-1b8be4a7315e", + "f5a2f3d4-5052-4f21-9017-a1d0ae8cb943", + "e4b43fa9-b807-45f4-93dd-0c523ade875f", + "4c6b108c-0c75-49e9-8371-8b5613fe1973", + "bc695037-a1d1-400e-b495-18097bb0c66b", + "de43bcbb-612a-4ed7-b493-244a7c6483ff", + "478a9fad-0453-4f16-aa40-4aea390f8462", + "f2727f30-1c71-4611-9c4e-917d22b546ba", + "beb3c122-a747-4328-8435-19d6e770609f", + "37c6e041-ecf3-45d6-ab26-339c1efcbb25", + "7a697c14-9953-4b09-8572-452fbe7e0d1c", + "f16842de-4118-4d92-921f-075c6dedca1e", + "c6789276-497a-451d-a8b5-17e684251eb6", + "f7370593-7f26-43ee-bce8-da1badf58f8b" +] + +DEFAULT_PROJECT_ID = random.choice(PROJECT_LIST) +DEFAULT_START_DATE = date(2023, 1, 1) +DEFAULT_END_DATE = date(2023, 5, 26) + + +#----------------------- DATA FETCHES ------------------------------------------# + +def get_project_mapping(): + + response = (supabase + .table('projects') + .select('id, name, github_org, description') + .order('name') + .execute()) + + mapping = { + project['id']: { + 'name': project['name'], + 'github': project['github_org'], + 'description': project['description'] + } + for project in response.data + if project['id'] in PROJECT_LIST + } + mapping = dict(sorted(mapping.items(), key=lambda x: x[1]['name'].lower())) + + return mapping + +PROJECT_MAPPING = get_project_mapping() + + +def get_events_from_project(project_id, start_date, end_date): + + response = (supabase + .table('events') + .select('*') + .eq('project_id', project_id) + .gte('event_time', start_date) + .lte('event_time', end_date) + .execute()) + + return response.data + +DEFAULT_EVENTS = get_events_from_project(DEFAULT_PROJECT_ID, DEFAULT_START_DATE, DEFAULT_END_DATE) + + +def analyze_events(events, min_contribs=1): + + project = PROJECT_MAPPING.get(events[0]['project_id']) + github_org = project.get('github') + + github_events = [] + onchain_events = [] + for e in events: + source = e['details']['source'] + if source == 'github': + github_events.append({ + 'github_org': github_org, + 'repo': e['details']['data']['repository.name'], + 'contributor': e['contributor'], + 'event_type': e['event_type'], + 'amount': e['amount'], + 'timestamp': e['event_time'] + }) + elif source == 'zerion': + onchain_events.append({ + 'event_type': e['event_type'], + 'buy_address': e['details']['data']['Buy Currency Address'], + 'sell_address': e['details']['data']['Sell Currency Address'], + 'amount': e['amount'], + 'timestamp': e['event_time'] + }) + else: + continue + + if min_contribs > 1: + contrib_counts = Counter([e['contributor'] for e in github_events]) + github_events = [ + e for e in github_events + if contrib_counts[e['contributor']] > min_contribs + ] + + return { + 'project': project, + 'github_events': github_events, + 'onchain_events': onchain_events + } + +DEFAULT_EVENT_ANALYSIS = analyze_events(DEFAULT_EVENTS) + + +#----------------------- DATAVIZ ----------------------------------------------# + + +def generate_treemap(events_dict, groupby='repo'): + + if groupby == 'repo': + nodes = ['github_org', 'repo', 'contributor'] + else: + nodes = ['github_org', 'contributor', 'repo'] + + df = pd.DataFrame(events_dict['github_events'])[nodes + ['amount']] + df.dropna(inplace=True) + + fig = px.treemap( + data_frame=df, + path=nodes, + values='amount', + color='contributor', + ) + + fig.update_layout( + margin=dict(t=20, l=10, r=10, b=10) + ) + + return fig + + +def generate_kpis(events_dict): + + project = events_dict['project'] + github_org = project.get('github') + project_name = project.get('name') + + git_events = events_dict['github_events'] + contrib_counts = Counter([e['contributor'] for e in git_events]) + repo_counts = Counter(e['repo'] for e in git_events) + event_counts = Counter(e['event_type'] for e in git_events) + events_string = ", ".join([f"{k}s - {v}" for k,v in event_counts.items()]) + + income = sum([ + e['amount'] for e in events_dict['onchain_events'] + if e['event_type'] == "funds received" + ]) + + return [ + dcc.Markdown( + f"### {project_name} \n"\ + f"A total of {len(contrib_counts)} contributors made " \ + f"{len(git_events)} contributions ({events_string}) in {len(repo_counts)} repos.\n\n" \ + f"The project also received ${income:,.0f} in on-chain funding over this period.", + style={'margin-bottom': "0px"} + ) + ] + + +#----------------------- SIDEBAR ----------------------------------------------# + +SIDEBAR_STYLE = { + "position": "fixed", + "top": 0, + "left": 0, + "bottom": 0, + "width": "16rem", + "padding": "2rem 1rem", + "background-color": "#f8f9fa", +} + +sidebar = html.Div( + [ + html.Div( + html.Img(src="assets/os-observer.png", style={"width": "50px"}), + style={"textAlign": "center"} + ), + html.Br(), + html.Div( + [ + html.P("Select an open source project:"), + dcc.Dropdown( + id="project-id", + options=[ + {"label": pdata['name'], "value": pid} + for (pid, pdata) in PROJECT_MAPPING.items() + ], + value=DEFAULT_PROJECT_ID, + style={"margin-left": "1px", "width": "14rem", "font-size": "12px"} + ), + html.Br(), + html.P("Group by:"), + dcc.Dropdown( + id="groupby-select", + options=[ + {"label": x, "value": x} + for x in ['repo', 'contributor'] + ], + value='repo', + style={"margin-left": "1px", "width": "14rem", "font-size": "12px"} + ), + html.Br(), + html.P("Select a time period:", style={"display": "inline-block"}), + dcc.DatePickerRange( + id="date-picker", + min_date_allowed=date(2018, 1, 1), + max_date_allowed=date(2023, 5, 26), + start_date=DEFAULT_START_DATE, + end_date=DEFAULT_END_DATE, + calendar_orientation='horizontal', + style={"margin-left": "1px", "width": "14rem", "font-size": "12px"} + ), + html.Br(), + html.Br(), + html.P("Min. contributions:"), + dcc.Input( + id="min-contribs", + type="number", + min=0, + step=1, + value=1, + style={"margin-left": "1px", "width": "14rem", "font-size": "12px"} + ) + ] + ), + html.Br(), + #html.Hr(), + html.H6("Project description"), + html.P( + PROJECT_MAPPING.get(DEFAULT_PROJECT_ID).get('description'), + id="project-description", + style={"fontSize": "small"} + ), + ], + style=SIDEBAR_STYLE +) + +#----------------------- CONTENT ----------------------------------------------# + +CONTENT_STYLE = { + "margin-left": "16rem", + "margin-right": "0rem", + "margin-top": "10px", + "margin-bottom": "10px", + "padding": "0rem", +} + +content = html.Div( + id="dashboard", + children=[ + html.P( + id='kpi-list', + children=generate_kpis(DEFAULT_EVENT_ANALYSIS), + style={'height': '15vh', 'margin-left': "10px", 'margin-bottom': "0px"}, + ), + dcc.Graph( + id='treemap', + figure=generate_treemap(DEFAULT_EVENT_ANALYSIS), + style={'height': '80vh', 'width': '100%'}, + ) + ], + style=CONTENT_STYLE +) + +#----------------------- APP SET-UP---------------------------------------------# + +app = dash.Dash(__name__, suppress_callback_exceptions=False, + external_stylesheets=[dbc.themes.BOOTSTRAP]) +server = app.server +app.title = "open source observer" +app.layout = html.Div([content, sidebar]) + +#----------------------- CALLBACKS --------------------------------------------# + +@app.callback( + [ + Output('treemap', 'figure'), + Output('project-description', 'children'), + Output('kpi-list', 'children') + ], + [ + Input('project-id', 'value'), + Input('groupby-select', 'value'), + Input('date-picker', 'start_date'), + Input('date-picker', 'end_date'), + Input('min-contribs', 'value'), + ] +) +def update_figure(project_id, groupby, start_date, end_date, min_contribs): + + if project_id is None: + raise PreventUpdate + + events = get_events_from_project(project_id, start_date, end_date) + if not len(events): + raise PreventUpdate + + events_dict = analyze_events(events, min_contribs) + + fig = generate_treemap(events_dict, groupby) + descr = PROJECT_MAPPING[project_id]['description'] + kpis = generate_kpis(events_dict) + + return [fig, descr, kpis] + +#----------------------- RUN APP ----------------------------------------------# + +if __name__ == '__main__': + app.run_server(debug=True) diff --git a/indexer/src/cli.ts b/indexer/src/cli.ts new file mode 100644 index 000000000..a26a495c1 --- /dev/null +++ b/indexer/src/cli.ts @@ -0,0 +1,117 @@ +#!/usr/bin/env node +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; +import { RunAutocrawlArgs, runAutocrawl } from "./actions/autocrawl.js"; +import { handleError } from "./utils/error.js"; +import { EventSourceFunction } from "./utils/api.js"; +import { NpmDownloadsArgs, NpmDownloadsInterface } from "./events/npm.js"; +import { + GithubFetchArgs, + GithubIssueFiledInterface, +} from "./actions/github/fetch/issueFiled.js"; +import { + UpsertGithubOrgInterface, + UpsertGithubOrgArgs, +} from "./actions/github/upsertOrg/index.js"; +import { GithubIssueClosedInterface } from "./actions/github/fetch/issueClosed.js"; + +const callLibrary = async ( + func: EventSourceFunction, + args: Args, +): Promise => { + // TODO: handle ApiReturnType properly and generically here + const result = await func(args); + console.log(result); +}; + +/** + * When adding a new fetcher, please remember to add it to both this registry and yargs + */ +export const FETCHER_REGISTRY = [ + GithubIssueFiledInterface, + NpmDownloadsInterface, +]; +yargs(hideBin(process.argv)) + .option("yes", { + type: "boolean", + describe: "Automatic yes to all prompts", + default: false, + }) + .option("autocrawl", { + type: "boolean", + describe: "Mark the query for auto-crawling", + default: false, + }) + .command( + "runAutocrawl", + "Iterate over EventSourcePointer table and update all data marked for autocrawl", + (yags) => { + yags; + }, + (argv) => handleError(runAutocrawl(argv)), + ) + .command( + UpsertGithubOrgInterface.command, + "Add or update a github organization", + (yags) => { + yags + .option("orgName", { + type: "string", + describe: "GitHub organization name", + }) + .demandOption(["orgName"]); + }, + (argv) => handleError(callLibrary(UpsertGithubOrgInterface.func, argv)), + ) + .command( + GithubIssueFiledInterface.command, + "Fetch GitHub Issues Filed", + (yags) => { + yags + .option("org", { + type: "string", + describe: "GitHub organization name", + }) + .option("repo", { + type: "string", + describe: "GitHub repository name", + }) + .demandOption(["org", "repo"]); + }, + (argv) => handleError(callLibrary(GithubIssueFiledInterface.func, argv)), + ) + .command( + GithubIssueClosedInterface.command, + "Fetch GitHub Issues Closed", + (yags) => { + yags + .option("org", { + type: "string", + describe: "GitHub organization name", + }) + .option("repo", { + type: "string", + describe: "GitHub repository name", + }) + .demandOption(["org", "repo"]); + }, + (argv) => handleError(callLibrary(GithubIssueClosedInterface.func, argv)), + ) + .command( + NpmDownloadsInterface.command, + "Fetch NPM downloads", + (yags) => { + yags + .option("name", { + type: "string", + describe: "Package name", + }) + .demandOption(["name"]); + }, + (argv) => handleError(callLibrary(NpmDownloadsInterface.func, argv)), + ) + .demandCommand() + .strict() + .help("h") + .alias("h", "help") + .parse(); diff --git a/indexer/src/config.ts b/indexer/src/config.ts new file mode 100644 index 000000000..45eb8e3d2 --- /dev/null +++ b/indexer/src/config.ts @@ -0,0 +1,14 @@ +import * as dotenv from "dotenv"; +dotenv.config(); + +export const requireEnv = (identifier: string) => { + const value = process.env[identifier]; + + if (!value) { + throw new Error(`Required env var ${identifier} does not exist`); + } + return value; +}; + +export const GITHUB_TOKEN = requireEnv("GITHUB_TOKEN"); +export const GITHUB_GRAPHQL_API = requireEnv("GITHUB_GRAPHQL_API"); diff --git a/indexer/src/database.py b/indexer/src/database.py new file mode 100644 index 000000000..e4ad278bd --- /dev/null +++ b/indexer/src/database.py @@ -0,0 +1,271 @@ +from dotenv import load_dotenv +import json +import logging +import os +import pandas as pd +from supabase import create_client, Client +import sys + +from validate_github_org import validate_github_org +from validate_eth_address import get_address_data + +from events.github_events import execute_org_query +from events.zerion_scraper import convert_csvs_to_records +from events.funding_rounds import get_transfers + + +QUERIES = ["merged PR", "issue", "created PR"] + + +PROJECTS_TABLE = 'projects' +WALLETS_TABLE = 'wallets' +EVENTS_TABLE = 'events' +FUNDING_TABLE = 'funding' + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + filename='logging.log' +) + + +# -------------- DATABASE SETUP -------------- # + +def supabase_client() -> Client: + load_dotenv() + url = os.environ.get("SUPABASE_URL") + key = os.environ.get("SUPABASE_KEY") + return create_client(url, key) + +supabase = supabase_client() + +# -------------- DATABASE OPS ---------------- # + + +def select_all(table): + response = (supabase + .table(table) + .select('*') + .execute()) + return response.data + + +def select_all_project_events(project_id, event_type): + response = (supabase + .table(EVENTS_TABLE) + .select('*') + .eq('project_id', project_id) + .eq('event_type', event_type) + .execute()) + return response.data + + +def select_col(table, col): + response = (supabase + .table(table) + .select(col) + .execute()) + lst = [x[col] for x in response.data] + return lst + + +def select_row(table, row_id): + response = (supabase + .table(table) + .select('*') + .eq('id', row_id) + .execute()) + if response.data: + return response.data[0] + + +def insert(table, records): + response = (supabase + .table(table) + .insert(records) + .execute()) + return response.data + + +def bulk_insert(table, records, lim=2000): + for i in range(0, len(records), lim): + insert(table, records[i:i + lim]) + + +# -------------- DB INSERT SCRIPTS -------------- # + + +def insert_project(project): + + name = project['name'] + github_org = project['github_org'] + description = project.get('description') + + record = dict( + name=name, + github_org=github_org, + description=description + ) + + response = (supabase + .table(PROJECTS_TABLE) + .select('id, name, github_org') + .ilike('name', f'%{name}%') + .execute()) + + if response.data: + logging.info(f"DUPLICATE PROJECT: {record} -> {response.data}") + return response.data + + response = (supabase + .table(PROJECTS_TABLE) + .select('id, name, github_org') + .ilike('github_org', f'%{github_org}%') + .execute()) + + if response.data: + logging.info(f"DUPLICATE PROJECT: {record} -> {response.data}") + return response.data + + return insert(PROJECTS_TABLE, record) + + +def insert_wallet(wallet_data): + + address = wallet_data['address'] + + response = (supabase + .table(WALLETS_TABLE) + .select('id, project_id') + .ilike('address', f'%{address}%') + .execute()) + + if response.data: + logging.info(f"DUPLICATE WALLET: {address} -> {response.data}") + return response.data + + return insert(WALLETS_TABLE, wallet_data) + + +def insert_grant_funding(funding_id): + + funding_data = select_row(FUNDING_TABLE, funding_id) + if not funding_data: + return + + grant = { + "chain": funding_data['chain'], + "address": funding_data['address'], + "token": [funding_data['token']], + "action": "tokentx" + } + transfers_data = get_transfers(grant) + + if not transfers_data: + return + + wallet_mapping = { + w['address'].lower():w['id'] + for w in select_all(WALLETS_TABLE) + } + + events_data = [] + for event in transfers_data: + addr = event['details'].get('to') + if addr: + project_id = wallet_mapping.get(addr.lower()) + if project_id: + event.update({'project_id': project_id}) + event['details'].update({'funding_id': funding_id}) + events_data.append(event) + + return insert(EVENTS_TABLE, events_data) + + +# -------------- POPULATE DB SCRIPTS------------- # + + +def populate_from_json(json_path): + + with open(json_path, 'r') as f: + projects_data = json.load(f) + + for project in projects_data: + if not validate_github_org(project['github_org']): + logging.info(f"INVALID GITHUB: {project['github_org']}") + continue + results = insert_project(project) + project_id = results[0]['id'] + for address in project['wallets']: + address_data = get_address_data(address) + if not address_data: + logging.info(f"INVALID WALLET: {address}") + continue + address_data.update({'project_id': project_id}) + insert_wallet(address_data) + + +def insert_project_github_events(query_num, project_id, start_date, end_date): + + project_data = select_row(PROJECTS_TABLE, project_id) + github_org = project_data['github_org'] + + events = execute_org_query(query_num, github_org, start_date, end_date) + for event in events: + event.update({"project_id": project_id}) + + bulk_insert(EVENTS_TABLE, events) + logging.info(f"Successfully added {len(events)} events for project {github_org}") + + +def insert_zerion_transactions(): + + records = convert_csvs_to_records() + + batch_size = 1000 + batches = [ + records[i:i + batch_size] + for i in range(0, len(records), batch_size) + ] + + for batch in batches: + response = (supabase + .table("events") + .insert(batch) + .execute()) + + +# -------------- MAIN SCRIPT -------------------- # + +def populate_db(): + + # populate projects and wallet addresses + populate_from_json("data/op-rpgf2/projects.json") + populate_from_json("data/gitcoin-allo/allo.json") + + # populate github events + start, end = '2018-01-01T00:00:00Z', '2023-05-25T00:00:00Z' + project_ids = select_col(PROJECTS_TABLE, 'id') + for query_num, query_name in enumerate(QUERIES): + for pid in project_ids: + existing_entries = select_all_project_events(pid, query_name) + if len(existing_entries): + logging.info(f"\nSkipping `{pid}` for project id: {pid}") + else: + logging.info(f"\nAdding `{pid}` for project id: {pid}") + insert_project_github_events(query_num, pid, start, end) + + # insert all zerion data (saved locally as csvs) + insert_zerion_transactions() + + + +if __name__ == "__main__": + + #populate_db() + insert_zerion_transactions() + + # testing + #start, end = '2022-01-01T00:00:00Z', '2023-05-24T00:00:00Z' + #insert_project_github_events(1, 1, start, end) \ No newline at end of file diff --git a/indexer/src/db/prisma-client.ts b/indexer/src/db/prisma-client.ts new file mode 100644 index 000000000..3c76d78c1 --- /dev/null +++ b/indexer/src/db/prisma-client.ts @@ -0,0 +1,114 @@ +import _ from "lodash"; +import { + PrismaClient, + ArtifactNamespace, + ArtifactType, + EventType, + Prisma, +} from "@prisma/client"; +import { assert, normalizeToObject } from "../utils/common.js"; + +export const prisma = new PrismaClient(); +export { ArtifactNamespace, ArtifactType, EventType }; + +/** + * Before you do any work to fetch data, use this to retrieve the EventSourcePointer + * from the database. + * - You'll only fetch data from this point forward + * - You'll need this to insert data below + * @param artifactId + * @param eventType + * @returns + */ +export async function getEventSourcePointer( + artifactId: number, + eventType: EventType, +) { + const record = await prisma.eventSourcePointer.findUnique({ + where: { + artifactId_eventType: { + artifactId, + eventType, + }, + }, + }); + // Safe because `Partial` means they're all optional props anyway + return normalizeToObject(record?.pointer); +} + +/** + * Idempotent insertions, which will + * - Check that the EventSourcePointer hasn't changed + * - Insert the data + * - Update the EventSourcePointer + * + * @param previousPointer + * @param artifactId + * @param events + * @param autocrawl + * @returns + */ +export async function insertData( + artifactId: number, + eventType: EventType, + events: Prisma.EventCreateManyInput[], + previousPointer: Prisma.JsonObject, + newPointer: Prisma.JsonObject, + queryCommand: string, + queryArgs: Prisma.JsonObject, + autocrawl?: boolean, +) { + // Set it all up as an atomic transaction + return await prisma.$transaction(async (txn) => { + // Check if the pointer hasn't changed, abort if so (concurrent job) + const dbCheckEvtSrcPtr = await txn.eventSourcePointer.findUnique({ + where: { + artifactId_eventType: { + artifactId, + eventType, + }, + }, + }); + + // Make sure that the pointer hasn't changed + assert( + _.isEqual( + normalizeToObject(dbCheckEvtSrcPtr?.pointer), + previousPointer, + ), + `EventSourcePointer has changed. Aborting. Expected$ ${JSON.stringify( + previousPointer, + )}, Saw ${JSON.stringify(dbCheckEvtSrcPtr?.pointer)}`, + ); + + // Insert the data + await txn.event.createMany({ + data: events, + skipDuplicates: true, + }); + + // Update the event source pointer + await txn.eventSourcePointer.upsert({ + where: { + artifactId_eventType: { + artifactId, + eventType, + }, + }, + update: { + queryCommand, + queryArgs, + pointer: newPointer, + ...(autocrawl ? { autocrawl } : {}), + }, + create: { + artifactId, + eventType, + queryCommand, + queryArgs, + pointer: newPointer, + ...(autocrawl ? { autocrawl } : {}), + }, + }); + }); +} diff --git a/indexer/src/events/__init__.py b/indexer/src/events/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/indexer/src/events/funding_rounds.py b/indexer/src/events/funding_rounds.py new file mode 100644 index 000000000..f1c95839e --- /dev/null +++ b/indexer/src/events/funding_rounds.py @@ -0,0 +1,98 @@ +from dotenv import load_dotenv +from datetime import datetime +import json +import os +import requests + +from web3 import Web3 + + +load_dotenv() +ALCHEMY_KEY = os.environ['ALCHEMY_KEY'] +ALCHEMY_KEY_OP = os.environ['ALCHEMY_KEY_OP'] +ETHERSCAN = os.environ['ETHERSCAN_KEY'] +ETHERSCAN_OP = os.environ['ETHERSCAN_KEY_OP'] + + +# create a web3 connection +w3 = Web3(Web3.HTTPProvider(f"https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}")) +op = Web3(Web3.HTTPProvider(f"https://opt-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY_OP}")) + +# Grants Database +# TODO refactor to pull from Supabase +GRANTS = { + "Optimism RetroPGF": { + "chain": "optimism", + "address": "0x19793c7824be70ec58bb673ca42d2779d12581be", + "action": "tokentx", + "token_symbols": ['OP'] + }, + "Gitcoin Grants - Test": { + "chain": "mainnet", + "address": "0x7d655c57f71464B6f83811C55D84009Cd9f5221C", + "action": "txlist", + "token_symbols": ['ETH', 'DAI'] + } +} + + +def convert_timestamp(ts): + + fmt = "%Y-%m-%d %H:%M:%S" + return datetime.fromtimestamp(int(ts)).strftime(fmt) + + +def get_txs(grant_data, start=0): + + if grant_data['chain'] == 'optimism': + subdomain = "api-optimistic" + apikey = ETHERSCAN_OP + else: + subdomain = "api" + apikey = ETHERSCAN + + end = 999999999 + headers = {"Accept": "application/json"} + + apicall = "&".join([ + f"https://{subdomain}.etherscan.io/api?module=account", + f"address={grant_data['address']}", + f"action={grant_data['action']}", + f"startblock={start}&endblock={end}", + f"apikey={apikey}" ]) + + response = requests.get(apicall, headers=headers) + json_data = response.json() + if json_data['message'] == 'OK': + result = json_data['result'] + return result + + +def get_transfers(grant): + + tx_data = get_txs(grant) + + if not tx_data: + return + + data = [] + for x in tx_data: + data.append({ + 'timestamp': convert_timestamp(x['timeStamp']), + 'data_source': 'etherscan', + 'event_type': 'grant', + 'amount': float(x['value']) / (10**int(x.get('tokenDecimal', 18))), + 'details': x + }) + + return data + + +if __name__ == '__main__': + + grant = GRANTS.get("Optimism RetroPGF") + data = get_transfers(grant) + print(data[-1]) + print(len(data)) + + #data = get_gitcoin_grants_transfers() \ No newline at end of file diff --git a/indexer/src/events/github.ts b/indexer/src/events/github.ts new file mode 100644 index 000000000..63c8b794b --- /dev/null +++ b/indexer/src/events/github.ts @@ -0,0 +1,79 @@ +import { gql } from "graphql-request"; + +export const query = gql` + {{ + search( + query: "org:{org} is:pr is:merged merged:{since}..{until}" + first: $first + after: $after + type: ISSUE + ) {{ + pageInfo {{ + hasNextPage + endCursor + }} + nodes {{ + ... on PullRequest {{ + createdAt + mergedAt + mergedBy {{ + login + }} + author {{ + login + }} + title + repository {{ + name + }} + url + }} + }} + }} + }}`; + +// startDate == since +// endDate == until +export const variables = { + first: 100, + after: "null", + org: "truffle-box", +}; + +// from python: +// test = execute_org_query(0, "truffle-box", "2022-01-01T00:00:00Z", "2023-04-22T00:00:00Z") + +// Date strings are first run through this function +// date_fmt = "%Y-%m-%dT%H:%M:%SZ" +// def to_date(date): +// return date.strftime(date_fmt) + +/** +async function getPointerForEventType( + event_type: EventType, +): Promise { + const pointer = await prisma.caching_pointer.findFirst({ + where: { event_enum: { equals: event_type } }, + }); + + if (!pointer) { + // TODO: error handling + return null; + } + + return pointer.pointer as any; +} + +interface EventTypePointerLookup { + [EventType.GITHUB_CREATED_PR]: GithubCreatedPrPointer; +} + +interface GithubCreatedPrPointer { + lastFetch: string; +} + +export async function main() { + const pointer = await getPointerForEventType(EventType.GITHUB_CREATED_PR); + console.log(pointer); +} +*/ diff --git a/indexer/src/events/github_events.py b/indexer/src/events/github_events.py new file mode 100644 index 000000000..5de3b360c --- /dev/null +++ b/indexer/src/events/github_events.py @@ -0,0 +1,145 @@ +from datetime import datetime, timedelta +from dotenv import load_dotenv +import logging +import os +import requests + +from events.graphql_queries import QUERIES + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + filename='logging.log' +) + +# -------------- HELPER FUNCTIONS -------------- # + +date_fmt = "%Y-%m-%dT%H:%M:%SZ" + +def to_date(date): + return date.strftime(date_fmt) + + +def find_dict_with_pageinfo(data): + if isinstance(data, dict): + for k, v in data.items(): + if v and 'pageInfo' in v: + return data[k] + result = find_dict_with_pageinfo(v) + if result is not None: + return result + return None + + +def flatten_dict(d): + flattened_dict = {} + for key, value in d.items(): + if isinstance(value, dict): + inner_dict = flatten_dict(value) + flattened_dict.update({f"{key}.{inner_key}": inner_value for inner_key, inner_value in inner_dict.items()}) + elif isinstance(value, list): + flattened_dict.update({f"{key}.{i}": item for i, item in enumerate(value)}) + else: + flattened_dict[key] = value + return flattened_dict + + +# -------------- QUERY CONSTRUCTORS -------------- # + +def run_query_for_org(query_func, github_org, start_date, end_date): + load_dotenv() + github_token = os.getenv('GITHUB_TOKEN') + + end_cursor = "null" + has_next_page = True + rate_limit_hit = False + events = [] + + while has_next_page: + query_string = query_func( + org=github_org, + first=100, + after=end_cursor, + since=start_date, + until=end_date + ) + response = requests.post( + 'https://api.github.com/graphql', + json={'query': query_string}, + headers={'Authorization': f'token {github_token}'} + ) + response_json = response.json() + data = find_dict_with_pageinfo(response_json.get('data')) + if not data: + logging.info(f"No items found for {github_org}.") + break + + key = data.get('edges') and "edges" or "nodes" + events.extend(data.get(key, [])) + + has_next_page = data['pageInfo']['hasNextPage'] + if has_next_page: + end_cursor = data['pageInfo']['endCursor'] + # cursor must be passed in quotes + end_cursor = f'"{end_cursor}"' + + if len(events) == 1000: + rate_limit_hit = True + logging.warning("Hit max limit of 1000 results. Retrying") + + return events, rate_limit_hit + + +def paginate_query_for_org(query_func, github_org, start_date, end_date): + start_dt = datetime.strptime(start_date, date_fmt) + max_dt = datetime.strptime(end_date, date_fmt) + delta_days = 180 + events = [] + + while start_dt < max_dt: + end_dt = start_dt + timedelta(days=delta_days) + if end_dt > max_dt: + end_dt = max_dt + logging.info("Attempting: %s - %s", to_date(start_dt), to_date(end_dt)) + new_events, rate_limit_hit = run_query_for_org(query_func, github_org, to_date(start_dt), to_date(end_dt)) + if rate_limit_hit: + delta_days //= 3 + else: + events.extend(new_events) + start_dt += timedelta(days=delta_days) + + return events + + +def execute_org_query(query_idx, github_org, start_date, end_date): + query = QUERIES[query_idx] + query_func = query['func'] + + events, rate_limit_hit = run_query_for_org(query_func, github_org, start_date, end_date) + if rate_limit_hit: + events = paginate_query_for_org(query_func, github_org, start_date, end_date) + + logging.info("Query %s: %d events found for `%s`", query['name'], len(events), github_org) + + records = [] + for event in events: + details = { + "source": "github", + "data": flatten_dict(event) + } + timestamp = details['data'].get(query.get('timestamp')) + contributor = details['data'].get(query.get('contributor')) + record = { + "event_time": timestamp or None, + "event_type": query['name'], + "contributor": contributor or None, + "amount": 1, + "details": details + } + records.append(record) + return records + + +if __name__ == "__main__": + test = execute_org_query(0, "gitcoinco", "2022-01-01T00:00:00Z", "2023-04-22T00:00:00Z") diff --git a/indexer/src/events/github_user.py b/indexer/src/events/github_user.py new file mode 100644 index 000000000..d829f07c0 --- /dev/null +++ b/indexer/src/events/github_user.py @@ -0,0 +1,56 @@ +from datetime import datetime, timedelta +from dotenv import load_dotenv +import os +import requests + + +def validate_github_user(username, start_date=None, end_date=None): + + if not isinstance(username, str): + return None + + date_fmt = "%Y-%m-%dT%H:%M:%SZ" + if not start_date and not end_date: + start_date = (datetime.today() - timedelta(days=365)).strftime(date_fmt) + end_date = datetime.today().strftime(date_fmt) + + query = """ + query ContributionsView($username: String!, $from: DateTime!, $to: DateTime!) { + user(login: $username) { + contributionsCollection(from: $from, to: $to) { + totalCommitContributions + totalIssueContributions + totalPullRequestContributions + totalPullRequestReviewContributions + } + } + } + """ + + load_dotenv() + token = os.getenv('GITHUB_TOKEN') + headers = {'Authorization': f'token {token}'} + variables = { + "username": username, + "from": start_date, + "to": end_date + } + response = requests.post( + 'https://api.github.com/graphql', + json={'query': query, 'variables': variables}, + headers=headers + ) + try: + response_json = response.json() + data = response_json['data'] + contributions = data['user']['contributionsCollection'] + return contributions + except: + print(f"Encountered error retrieving contributions for https://github.com/{username}.") + print(response_json) + return None + + +if __name__ == "__main__": + # test case + validate_github_user("ccerv1") diff --git a/indexer/src/events/graphql_queries.py b/indexer/src/events/graphql_queries.py new file mode 100644 index 000000000..983af68ad --- /dev/null +++ b/indexer/src/events/graphql_queries.py @@ -0,0 +1,177 @@ +# GraphQL Query Strings + + +def query_commits(org, first, after, since, until): + # currently not active / working + return f''' + {{ + repository( + org: "{org}" + ) {{ + defaultBranchRef {{ + target {{ + ... on Commit {{ + history( + first: {first} + after: {after} + since: "{since}" + until: "{until}" + ) {{ + pageInfo {{ + hasNextPage + endCursor + }} + node {{ + committedDate + author {{ + user {{ + login + }} + }} + additions + deletions + message + repository {{ + name + }} + url + }} + }} + }} + }} + }} + }} + }} + ''' + + +def query_merged_prs(org, first, after, since, until): + return f''' + {{ + search( + query: "org:{org} is:pr is:merged merged:{since}..{until}" + first: {first} + after: {after} + type: ISSUE + ) {{ + pageInfo {{ + hasNextPage + endCursor + }} + nodes {{ + ... on PullRequest {{ + createdAt + mergedAt + mergedBy {{ + login + }} + author {{ + login + }} + title + repository {{ + name + }} + url + }} + }} + }} + }} + ''' + + +def query_created_prs(org, first, after, since, until): + return f''' + {{ + search( + query: "org:{org} is:pr created:{since}..{until}" + first: {first} + after: {after} + type: ISSUE + ) {{ + pageInfo {{ + hasNextPage + endCursor + }} + nodes {{ + ... on PullRequest {{ + createdAt + mergedAt + mergedBy {{ + login + }} + author {{ + login + }} + title + repository {{ + name + }} + url + }} + }} + }} + }} + ''' + + +def query_issues(org, first, after, since, until): + return f''' + {{ + search( + query: "org:{org} is:issue -reason:NOT_PLANNED created:{since}..{until}" + first: {first} + after: {after} + type: ISSUE + ) {{ + pageInfo {{ + hasNextPage + endCursor + }} + nodes {{ + ... on Issue {{ + createdAt + closedAt + author {{ + login + }} + title + repository {{ + name + }} + url + state + stateReason + }} + }} + }} + }} + ''' + + +QUERIES = [ + # { + # "name": "commits", + # "func": query_commits, + # "timestamp": "committedDate", + # "contributor": "author.user.login" + # }, + { + "name": "merged PR", + "func": query_merged_prs, + "timestamp": "mergedAt", + "contributor": "mergedBy.login" + }, + { + "name": "issue", + "func": query_issues, + "timestamp": "createdAt", + "contributor": "author.login" + }, + { + "name": "created PR", + "func": query_created_prs, + "timestamp": "createdAt", + "contributor": "author.login" + } +] \ No newline at end of file diff --git a/indexer/src/events/npm.ts b/indexer/src/events/npm.ts new file mode 100644 index 000000000..15bd0826b --- /dev/null +++ b/indexer/src/events/npm.ts @@ -0,0 +1,319 @@ +import dayjs, { Dayjs } from "dayjs"; +import _ from "lodash"; +import npmFetch from "npm-registry-fetch"; +import { + ArtifactNamespace, + ArtifactType, + EventType, + getEventSourcePointer, + insertData, + prisma, +} from "../db/prisma-client.js"; +import { + EventSourceFunction, + ApiInterface, + ApiReturnType, + CommonArgs, +} from "../utils/api.js"; +import { + assert, + ensureString, + ensureArray, + ensureNumber, + safeCast, +} from "../utils/common.js"; +import { InvalidInputError, MalformedDataError } from "../utils/error.js"; +import { logger } from "../utils/logger.js"; +import { parseGithubUrl } from "../utils/parsing.js"; + +// API endpoint to query +const NPM_HOST = "https://api.npmjs.org/"; +// npm was initially released 2010-01-12 +const DEFAULT_START_DATE = "2010-01-01"; +const NPM_DOWNLOADS_COMMAND = "npmDownloads"; +// Only get data up to 2 days ago, accounting for incomplete days and time zones +const TODAY_MINUS = 2; + +// date format used by NPM APIs +export const formatDate = (date: Dayjs) => date.format("YYYY-MM-DD"); +// human-readable URL for a package +const getNpmUrl = (name: string) => `https://www.npmjs.com/package/${name}`; + +/** + * What we expect to store in the EventSourcePointer DB table + */ +interface NpmEventSourcePointer { + lastDate: string; +} + +const makeNpmEventSourcePointer = (lastDate: Dayjs): NpmEventSourcePointer => ({ + lastDate: formatDate(lastDate), +}); + +interface DayDownloads { + downloads: number; + day: string; +} + +function createDayDownloads(x: any): DayDownloads { + return { + downloads: ensureNumber(x.downloads), + day: ensureString(x.day), + }; +} + +/** + * Get the artifact and organization for a package, creating it if it doesn't exist + * + * @param name npm package name + * @returns Artifact + */ +async function getArtifactOrganization(name: string) { + // Get package.json + logger.debug(`Fetching package.json`); + const pkgManifest: any = await npmFetch.json(`/${name}/latest`); + //console.log(JSON.stringify(pkgManifest, null, 2)); + + // Check if the organization exists + const repoUrl = pkgManifest?.repository?.url ?? ""; + logger.info(`Repository URL: ${repoUrl}`); + const { owner: githubOrg } = parseGithubUrl(repoUrl) ?? {}; + if (!githubOrg) { + logger.warn(`Unable to find the GitHub organization for ${name}`); + } else { + logger.info(`GitHub organization for ${name}: ${githubOrg}`); + } + + // Upsert the organization and artifact into the database + logger.debug("Upserting organization and artifact into database"); + const dbOrg = githubOrg + ? await prisma.organization.upsert({ + where: { + githubOrg, + }, + update: {}, + create: { + name: githubOrg, + githubOrg, + }, + }) + : null; + const dbArtifact = await prisma.artifact.upsert({ + where: { + type_namespace_name: { + type: ArtifactType.NPM_PACKAGE, + namespace: ArtifactNamespace.NPM_REGISTRY, + name: name, + }, + }, + update: {}, + create: { + organizationId: dbOrg?.id, + type: ArtifactType.NPM_PACKAGE, + namespace: ArtifactNamespace.NPM_REGISTRY, + name: name, + url: getNpmUrl(name), + }, + }); + logger.info("Inserted organization into DB", dbOrg); + logger.info("Inserted artifact into DB", dbArtifact); + + return dbArtifact; +} + +/** + * When you query the NPM API with a range, it may only return a subset of dates you want + * This function lets us recurse until we get everything + * @param name npm package name + * @param start date inclusive + * @param end date inclusive + */ +async function getDailyDownloads( + name: string, + start: Dayjs, + end: Dayjs, +): Promise { + const dateRange = `${formatDate(start)}:${formatDate(end)}`; + const endpoint = `/downloads/range/${dateRange}/${name}`; + logger.debug(`Fetching ${endpoint}`); + const results = await npmFetch + .json(endpoint, { registry: NPM_HOST }) + .catch((err) => { + logger.warn("Error fetching from NPM API: ", err); + return; + }); + // If we encounter an error, just return an empty array + if (!results) { + return []; + } + //logger.info(JSON.stringify(fetchResults, null, 2)); + const resultStart = dayjs(ensureString(results.start)); + const resultEnd = dayjs(ensureString(results.end)); + const resultDownloads = ensureArray(results.downloads).map( + createDayDownloads, + ); + logger.info( + `Got ${resultDownloads.length} results from ${formatDate( + resultStart, + )} to ${formatDate(resultEnd)}`, + ); + + // If we got all the data, we're good + if (start.isSame(resultStart, "day") && end.isSame(resultEnd, "day")) { + return [...resultDownloads]; + } else if (!end.isSame(resultEnd, "day")) { + // Assume that NPM will always give us the newest data first + throw new MalformedDataError( + `Expected end date ${formatDate(end)} but got ${formatDate(resultEnd)}`, + ); + } else { + // If we didn't get all the data, recurse + const missingEnd = resultStart.subtract(1, "day"); + const missingResults = await getDailyDownloads(name, start, missingEnd); + return [...missingResults, ...resultDownloads]; + } +} + +/** + * Checks to see if the downloads are missing any days between start and end + * @param downloads + * @param start + * @param end + * @returns + */ +export function getMissingDays( + downloads: DayDownloads[], + start: Dayjs, + end: Dayjs, +): Dayjs[] { + if (start.isAfter(end, "day")) { + throw new InvalidInputError( + `Start date ${formatDate(start)} is after end date ${formatDate(end)}`, + ); + } + + // According to spec, searches must be sublinear + const missingDays: Dayjs[] = []; + const dateSet = new Set(downloads.map((d) => d.day)); + for ( + let datePtr = dayjs(start); + datePtr.isBefore(end, "day") || datePtr.isSame(end, "day"); + datePtr = datePtr.add(1, "day") + ) { + if (!dateSet.has(formatDate(datePtr))) { + missingDays.push(datePtr); + } + } + return missingDays; +} + +/** + * Checks whether there are any duplicate days in the downloads + * @param downloads + */ +export function hasDuplicates(downloads: DayDownloads[]): boolean { + const dates = downloads.map((d) => d.day); + const deduplicated = _.uniq(dates); + return dates.length !== deduplicated.length; +} + +/** + * Entrypoint arguments + */ +export type NpmDownloadsArgs = Partial< + CommonArgs & { + name: string; + } +>; + +/** + * Get all of the daily downloads for a package + * @param args + */ +export const npmDownloads: EventSourceFunction = async ( + args: NpmDownloadsArgs, +): Promise => { + const { name, autocrawl } = args; + + if (!name) { + throw new InvalidInputError("Missing required argument: name"); + } + logger.info(`NPM Downloads: fetching for ${name}`); + + // Add the organization and artifact into the database + const dbArtifact = await getArtifactOrganization(name); + + // Get the latest event source pointer + logger.debug("Getting latest event source pointer"); + const previousPointer = await getEventSourcePointer( + dbArtifact.id, + EventType.DOWNLOADS, + ); + logger.info(`EventSourcePointer: ${JSON.stringify(previousPointer)}`); + + // Start 1 day after the last date we have + const start = dayjs(previousPointer.lastDate ?? DEFAULT_START_DATE).add( + 1, + "day", + ); + // Today's counts may not yet be complete + const end = dayjs().subtract(TODAY_MINUS, "day"); + logger.info( + `Fetching from start=${formatDate(start)} to end=${formatDate( + end, + )}. Today is ${formatDate(dayjs())}`, + ); + + // Short circuit if we're already up to date + if (end.isBefore(start, "day")) { + return { + _type: "upToDate", + cached: true, + }; + } + + // Retrieve any missing data + const downloads: DayDownloads[] = await getDailyDownloads(name, start, end); + + // Check for correctness of data + assert(!hasDuplicates(downloads), "Duplicate dates found in result"); + // If this is the first time running this query, just check that we have the last day + const missingDays = !previousPointer.lastDate + ? getMissingDays(downloads, end, end) + : getMissingDays(downloads, start, end); + assert( + missingDays.length === 0, + `Missing dates found in result: ${missingDays.map(formatDate).join(", ")}`, + ); + + // Transform the data into the format we want to store + const dbEntries = downloads.map((d) => ({ + artifactId: dbArtifact.id, + eventType: EventType.DOWNLOADS, + eventTime: dayjs(d.day).toDate(), + amount: d.downloads, + })); + + // Populate the database + await insertData( + dbArtifact.id, + EventType.DOWNLOADS, + dbEntries, + previousPointer, + safeCast>(makeNpmEventSourcePointer(end)), + NPM_DOWNLOADS_COMMAND, + safeCast>(args), + autocrawl, + ); + + // Return results + return { + _type: "success", + count: downloads.length, + }; +}; + +export const NpmDownloadsInterface: ApiInterface = { + command: NPM_DOWNLOADS_COMMAND, + func: npmDownloads, +}; diff --git a/indexer/src/events/readme.md b/indexer/src/events/readme.md new file mode 100644 index 000000000..68210bf1c --- /dev/null +++ b/indexer/src/events/readme.md @@ -0,0 +1,93 @@ +# Github Event Tracking + +## User Story + +As a contributor or analyst, I'd like to see documentation that shows the current set of queries that are being tracked as GitHub events as well as a GraphQL sandbox for testing out the queries. + +## Query Tracking + +The following queries are currently being tracked as events for a given Github organization: + +- Created PR +- Merged PR +- Created Issue + +## Creating New Queries + +New queries should have the following fields: + +- `id` (auto-generated) +- `name` (see examples above) +- `source` (set to "github") +- `units` (most queries return an array of event nodes, so this can be set to "nodes") +- `query_function` (see below) + +### Example `query_function`: Merged PR + +**Parameters:** + +- `$org`: the Github organization name (eg, `hypercerts-org`) +- `$since`: a Github compatible timestamp, eg, `2022-01-01T00:00:00Z` +- `$until`: a Github compatible timestamp, eg, `2023-04-22T00:00:00Z` + +**Query:** + +```graphql +{ + search( + query: "org:$org is:pr is:merged merged:$since..$until" + first: 100 + type: ISSUE + ) { + pageInfo { + hasNextPage + endCursor + } + nodes { + ... on PullRequest { + title + url + createdAt + mergedAt + mergedBy { + login + } + author { + login + } + } + } + } +} +``` + +## Normalizing Query Results + +The result should then be normalized as follows: + +- `id` (auto-generated) +- `project_id` (the name of the Github organization being queried) +- `observer_id` (the name of the query) +- `timestamp` (when the event occured on Github) +- `amount` (always set to 1.0) +- `details` (a flattened JSON of all the other information returned by the query) + +## Testing Queries + +To test out the queries, you can use GitHub's GraphQL API Explorer. + +1. Login to GitHub and go to the [Explorer](https://docs.github.com/en/graphql/overview/explorer). Once there, you will see an interactive GraphQL environment where you can enter queries. + +2. Enter your desired query in the provided input field. + +3. Click the "Play" button to execute the query. The results of the query will be displayed in the response panel below. + +4. Analyze the results and iterate on your query as needed. + +### Query Variables + +If your query requires variables, you can provide them in the "Query Variables" section of the GraphQL Explorer. This allows you to pass dynamic values to your queries. + +### Rate Limiting + +The GitHub API limits each request to 100 records and 10 pages. This means you can't extract more than 1000 records from a single query. You can break the query up into smaller pieces by reducing the date range, or providing other filtering parameters. diff --git a/indexer/src/events/zerion_scraper.py b/indexer/src/events/zerion_scraper.py new file mode 100644 index 000000000..d65b571fa --- /dev/null +++ b/indexer/src/events/zerion_scraper.py @@ -0,0 +1,230 @@ +from dotenv import load_dotenv +import json +import os +import pandas as pd +import shutil +import time + +from supabase import create_client, Client + +from selenium import webdriver +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait + +from webdriver_manager.chrome import ChromeDriverManager + +# -------------------- DATABASE -------------------- # + +load_dotenv() +url = os.environ.get("SUPABASE_URL") +key = os.environ.get("SUPABASE_KEY") +supabase: Client = create_client(url, key) + + +def fetch_list_of_wallets(): + response = (supabase + .table('wallets') + .select('address, project_id') + .execute()) + + return response.data + +# -------------------- SCRAPER -------------------- # + +DOWNLOAD_DIR = os.getcwd() +STORAGE_DIR = "data/temp" + +SLEEP = 10 +MAX_TRIES = 5 + + +def download_zerion_history(driver, wallet_address): + destination = f'{STORAGE_DIR}/{wallet_address}.csv' + url = f'https://app.zerion.io/{wallet_address}/history' + + driver.get(url) + print(f"Loading Zerion history at: {url}") + time.sleep(SLEEP) # wait for page to load + try: + accept_button = driver.find_element(By.XPATH, "//*[contains(text(),'Accept')]/ancestor::button") + accept_button.click() + time.sleep(SLEEP) # wait for cookies to be accepted + except: + pass + + try: + print("Clicking download button...") + button = WebDriverWait(driver, SLEEP * 2).until( + EC.element_to_be_clickable((By.XPATH, "//button[contains(.,'Download CSV')]")) + ) + button.click() + except: + print("Zerion appears unable to support analytics for this address:", url) + return + + for tries in range(0, 5): + time.sleep(SLEEP) # wait for download to complete + files = [ + os.path.join(DOWNLOAD_DIR, f) + for f in os.listdir(DOWNLOAD_DIR) + if ".csv" in f + ] + if files: + downloaded_file = max(files, key=os.path.getctime) + if wallet_address in downloaded_file.lower(): + shutil.move(downloaded_file, destination) + print(f"Successfully downloaded Zerion history to: {destination}.") + return + print("Most recent file:", downloaded_file) + + print("Unable to find a history for this address:", url) + + +def retrieve_wallet_history(wallet_address, override=False): + wallet_address = wallet_address.lower() + if not override: + destination = f'{STORAGE_DIR}/{wallet_address}.csv' + if os.path.isfile(destination): + print(f"File for {wallet_address} already exists. Skipping download.") + return + + chrome_options = Options() + chrome_options.add_argument('--headless') + + # Automatically download and configure the appropriate ChromeDriver + driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) + + download_zerion_history(driver, wallet_address) + driver.quit() + + +def run_scraper(override=False): + + try: + + test = retrieve_wallet_history('0xc44F30Be3eBBEfdDBB5a85168710b4f0e18f4Ff0') + + wallet_data = fetch_list_of_wallets() + for w in wallet_data: + addr = w['address'] + retrieve_wallet_history(addr, override=override) + + except Exception as e: + print(f"An error occurred: {e}") + print("Attempting to download the appropriate ChromeDriver...") + + try: + webdriver.Chrome(ChromeDriverManager().install()) + print("ChromeDriver installation successful.") + print("Please run the script again to continue.") + except Exception as e: + print("Failed to download ChromeDriver. Please install it manually.") + print(f"Error message: {e}") + +# -------------------- ETL HELPERS -------------------- # + +STR_FIELDS = [ + 'Transaction Type', 'Status', 'Chain', + 'Buy Currency', 'Buy Currency Address', 'Buy Fiat Currency', + 'Sell Currency', 'Sell Currency Address', 'Sell Fiat Currency', + 'Fee Currency', 'Fee Fiat Currency', + 'Tx Hash', 'Link', 'Timestamp' +] + +FLT_FIELDS = [ + 'Buy Amount', 'Buy Fiat Amount', + 'Sell Amount', 'Sell Fiat Amount', + 'Fee Amount', 'Fee Fiat Amount' +] + +FIELDS = STR_FIELDS + FLT_FIELDS + + +def to_numeric(x): + if pd.isna(x): + return 0 + try: + return float(x) + except: + if isinstance(x, str): + if "\n" in x: + return to_numeric(x.split("\n")[0]) + + +def classify_event(event_type, status, buy, sell, fee): + if status == 'Confirmed': + if event_type == 'receive': + return ('funds received', buy) + if event_type == 'send': + return ('funds sent', sell+fee) + return ('transaction executed', fee) + + +def consolidate_csvs(storage_dir): + + wallet_data = fetch_list_of_wallets() + wallet_mapping = {w['address'].lower(): w['project_id'] for w in wallet_data} + csv_paths = [f for f in os.listdir(storage_dir) if f.endswith(".csv")] + + dfs = [] + for file in csv_paths: + df = pd.read_csv(os.path.join(storage_dir, file), usecols=FIELDS) + for c in df.columns: + if c in FLT_FIELDS: + df[c] = df[c].apply(to_numeric) + df.fillna("", inplace=True) + + wallet = os.path.splitext(file)[0].lower() + project_id = wallet_mapping.get(wallet) + if not project_id: + print(f"Unable to locate a project associated with wallet {wallet}") + continue + + df['details'] = df.apply(lambda x: {'data': dict(x), 'source': 'zerion'}, axis=1) + df['project_id'] = project_id + df['event_time'] = df['Timestamp'] + df['event_type'], df['amount'] = zip( + *df.apply(lambda x: classify_event( + x['Transaction Type'], + x['Status'], + x['Buy Fiat Amount'], + x['Sell Fiat Amount'], + x['Fee Fiat Amount'] + ), axis=1) + ) + + df.drop(columns=FIELDS, inplace=True) + dfs.append(df) + + return pd.concat(dfs, axis=0, ignore_index=True) + + +def convert_csvs_to_records(): + df = consolidate_csvs(STORAGE_DIR) + records = df.to_dict(orient='records') + return records + + +def identify_funding_events(): + records = convert_csvs_to_records() + funding_events = [] + for r in records: + if r['event_type'] != 'funds received': + continue + details = r.pop('details')['data'] + r.update(details) + funding_events.append(r) + return funding_events + + + +# -------------------- MAIN SCRIPT -------------------- # + +if __name__ == '__main__': + + run_scraper(override=False) + # convert_csvs_to_records() + + diff --git a/indexer/src/fetchEvents.ts b/indexer/src/fetchEvents.ts new file mode 100644 index 000000000..7ff788141 --- /dev/null +++ b/indexer/src/fetchEvents.ts @@ -0,0 +1,105 @@ +import { + Artifact, + ArtifactNamespace, + ArtifactType, + EventType, + PrismaClient, + EventSourcePointer, +} from "@prisma/client"; +import { fetchGithubIssues } from "./actions/github/fetchIssues/index.js"; + +export interface FetchEventsArgs { + artifactId: number; + eventType: string; +} + +function isEventType(str: string): str is EventType { + return str in EventType; +} + +export async function fetchEvents(args: FetchEventsArgs) { + const prisma = new PrismaClient(); + + const artifact = await prisma.artifact.findUnique({ + where: { id: args.artifactId }, + }); + if (!artifact) { + throw new Error(`Failed to find artifact for id ${args.artifactId}`); + } + + if (!isEventType(args.eventType)) { + throw new Error(`Unknown eventType ${args.eventType}`); + } + const eventType = EventType[args.eventType]; + + // [artifactId, eventType] tuples are enforced as unique in the DB, but the prisma client does not understand this so we can't use findUnique + const pointer = await prisma.eventSourcePointer.findFirst({ + where: { + AND: [ + { + artifactId: artifact.id, + }, + { + eventType: eventType, + }, + ], + }, + }); + + if (!pointer) { + throw new Error(`No pointer found for artifact and event type`); + } + + const fetcher = findFetcher(artifact, args.eventType); + if (!fetcher) { + throw new Error( + `No matching fetcher found for artifact+event. artifactNamespace: ${artifact.namespace}, artifactType: ${artifact.type}, eventType: ${args.eventType}`, + ); + } + + fetcher(artifact, pointer); +} + +function findFetcher( + artifact: Artifact, + eventType: string, +): FetcherFunc | null { + for (const eventFetcher of EVENT_FETCHERS) { + if ( + eventFetcher.key.artifactNamespace == artifact.namespace && + eventFetcher.key.artifactType == artifact.type && + eventFetcher.key.eventType == eventType + ) { + return eventFetcher.fetcher; + } + } + + return null; +} + +type FetcherFunc = ( + artifact: Artifact, + pointer: EventSourcePointer, +) => Promise; + +interface EventFetcherKey { + artifactNamespace: ArtifactNamespace; + artifactType: ArtifactType; + eventType: EventType; +} + +interface EventFetcher { + key: EventFetcherKey; + fetcher: FetcherFunc; +} + +const EVENT_FETCHERS: EventFetcher[] = [ + { + key: { + artifactNamespace: ArtifactNamespace.GITHUB, + artifactType: ArtifactType.GIT_REPOSITORY, + eventType: EventType.ISSUE_FILED, + }, + fetcher: fetchGithubIssues, + }, +]; diff --git a/indexer/src/index.ts b/indexer/src/index.ts new file mode 100644 index 000000000..a327f5d04 --- /dev/null +++ b/indexer/src/index.ts @@ -0,0 +1,2 @@ +import { NpmDownloadsArgs, npmDownloads } from "./events/npm.js"; +export { NpmDownloadsArgs, npmDownloads }; diff --git a/indexer/src/schema.sql b/indexer/src/schema.sql new file mode 100644 index 000000000..11b04afa8 --- /dev/null +++ b/indexer/src/schema.sql @@ -0,0 +1,36 @@ +create table + public.projects ( + id uuid not null default gen_random_uuid (), + created_at timestamp with time zone not null default current_timestamp, + name text not null, + github_org text not null, + description text not null, + constraint projects_pkey primary key (id) + ) tablespace pg_default; + + + create table + public.events ( + id uuid not null default gen_random_uuid (), + created_at timestamp with time zone not null default current_timestamp, + project_id uuid not null, + event_time timestamp with time zone null, + event_type text null, + contributor text null, + amount double precision null, + details jsonb null, + constraint events_pkey primary key (id) + ) tablespace pg_default; + + + create table + public.wallets ( + id uuid not null default gen_random_uuid (), + created_at timestamp with time zone not null default current_timestamp, + address text null, + project_id uuid not null, + type text null, + ens text null, + constraint wallets_pkey primary key (id), + constraint wallets_project_id_fkey foreign key (project_id) references projects (id) on update cascade on delete restrict + ) tablespace pg_default; \ No newline at end of file diff --git a/indexer/src/utils/api.ts b/indexer/src/utils/api.ts new file mode 100644 index 000000000..f4cbef12c --- /dev/null +++ b/indexer/src/utils/api.ts @@ -0,0 +1,29 @@ +import { ADT } from "ts-adt"; + +export interface CommonArgs { + // Auto-respond yes to any user-prompts (useful for CI) + yes?: boolean; + // Mark the query for auto-crawling + // Note: we currently ignore this when false, only updating the column when true + autocrawl?: boolean; +} + +export interface ApiInterface { + command: string; + func: EventSourceFunction; +} + +export interface EventSourceFunction { + (args: Args): Promise; +} + +export type ApiReturnType = ADT<{ + // Signals that there was nothing to retrieve + upToDate: { cached: true }; + // Signals that we had to retrieve `count` events the the source + success: { count: number }; + // Signals that we partially retrieved some data, but go stuck at a rate-limit + rateLimited: { count: number }; + // Signals that we encountered an error + error: { e: Error }; +}>; diff --git a/indexer/src/utils/common.ts b/indexer/src/utils/common.ts new file mode 100644 index 000000000..6603e4e6c --- /dev/null +++ b/indexer/src/utils/common.ts @@ -0,0 +1,114 @@ +import _ from "lodash"; +import { AssertionError, NullOrUndefinedValueError } from "./error.js"; + +/** + * Asserts that a condition is true. + * @param cond + * @param msg + */ +export function assert(cond: T, msg: string): asserts cond { + if (!cond) { + // eslint-disable-next-line no-debugger + debugger; + throw new AssertionError(msg || "Assertion failed"); + } +} + +/** + * Asserts that a branch is never taken. + * Useful for exhaustiveness checking. + * @param _x + */ +export function assertNever(_x: never): never { + throw new Error("unexpected branch taken"); +} + +/** + * Asserts that a value is not null or undefined. + * @param x + * @param msg + * @returns + */ +export function ensure(x: T | null | undefined, msg: string): T { + if (x === null || x === undefined) { + // eslint-disable-next-line no-debugger + debugger; + throw new NullOrUndefinedValueError( + `Value must not be undefined or null${msg ? `- ${msg}` : ""}`, + ); + } else { + return x; + } +} + +/** + * Asserts that a value is a string. + * @param x + * @returns + */ +export function ensureString(x: any) { + if (_.isString(x)) { + return x; + } else { + throw new Error(`Expected string, but got ${typeof x}`); + } +} + +/** + * Asserts that a value is a number + * @param x + * @returns + */ +export function ensureNumber(x: any) { + if (_.isNumber(x)) { + return x; + } else { + throw new Error(`Expected number, but got ${typeof x}`); + } +} + +/** + * Asserts that a value is an array. + * @param x + * @returns + */ +export function ensureArray(x: T | T[] | undefined): T[] { + if (x == null) { + return []; + } else if (Array.isArray(x)) { + return x; + } else { + return [x]; + } +} + +/** + * Return an object type that can be used for comparisons + * @param record + * @returns + */ +export const normalizeToObject = (record?: any) => + safeCast(_.toPlainObject(record) as Partial); + +/** + * Explicitly mark that a cast is safe. + * e.g. `safeCast(x as string[])`. + */ +export function safeCast(x: T): T { + return x; +} + +/** + * Mark that a cast is tech debt that needs to be cleaned up. + */ +export function hackyCast(x: any): T { + return x; +} + +/** + * Marks that a cast should be checked at runtime. + * Usually this is at some system boundary, e.g. a message received over the network. + */ +export function uncheckedCast(x: any): T { + return x; +} diff --git a/indexer/src/utils/error.ts b/indexer/src/utils/error.ts new file mode 100644 index 000000000..51bd23adc --- /dev/null +++ b/indexer/src/utils/error.ts @@ -0,0 +1,39 @@ +import chalk from "chalk"; +import { logger } from "./logger.js"; + +// Expecting a value +export class NullOrUndefinedValueError extends Error {} + +// Explicit assert fails +export class AssertionError extends Error {} + +// Invalid inputs to a function +export class InvalidInputError extends Error {} + +// Data is malformed +export class MalformedDataError extends Error {} + +/** + * Represents an error that doesn't need to be forwarded to Sentry. + * These are usually errors that are the user's fault + */ +export class HandledError extends Error {} + +/** + * Catches HandledErrors and just exits + * Forwards all other errors along. + * @param p + * @returns + */ +export const handleError = (p: Promise) => { + return p.catch((e) => { + if (e.message) { + logger.error(chalk.bold(chalk.redBright("\nError: ")) + e.message); + } + if (e instanceof HandledError) { + process.exit(1); + } else { + throw e; + } + }); +}; diff --git a/indexer/src/utils/getPath.ts b/indexer/src/utils/getPath.ts new file mode 100644 index 000000000..17e5fab59 --- /dev/null +++ b/indexer/src/utils/getPath.ts @@ -0,0 +1,49 @@ +// ex: getPath({ user: { name: 'u1' }}, "user.name") +export function getPath< + T extends Record, + K extends Path, +>(obj: T, path: K): Choose { + // https://stackoverflow.com/a/6394168 + return path.split(".").reduce((o, i) => o[i], obj) as any; +} + +// Here there be dragons +// https://www.calebpitan.com/blog/dot-notation-type-accessor-in-typescript + +type ExcludeArrayKeys = T extends ArrayLike + ? Exclude + : keyof T; +export type IsAny = unknown extends T + ? [keyof T] extends [never] + ? false + : true + : false; + +type PathImpl2 = PathImpl | keyof T; + +type PathImpl = Key extends string + ? IsAny extends true + ? never + : T[Key] extends Record + ? + | `${Key}.${PathImpl> & string}` + | `${Key}.${ExcludeArrayKeys & string}` + : never + : never; + +export type Path = keyof T extends string + ? PathImpl2 extends infer P + ? P extends string | keyof T + ? P + : keyof T + : keyof T + : never; + +export type Choose< + T extends Record, + K extends Path, +> = K extends `${infer U}.${infer Rest}` + ? Rest extends Path + ? Choose + : never + : T[K]; diff --git a/indexer/src/utils/github/getGithubPointer.ts b/indexer/src/utils/github/getGithubPointer.ts new file mode 100644 index 000000000..9cef0459b --- /dev/null +++ b/indexer/src/utils/github/getGithubPointer.ts @@ -0,0 +1,64 @@ +import { Artifact } from "@prisma/client"; +import { GithubFetchArgs } from "../../actions/github/fetch/issueFiled.js"; +import { GithubEventPointer } from "../../actions/github/upsertOrg/createEventPointersForRepo.js"; +import { EventType, prisma } from "../../db/prisma-client.js"; +import { InvalidInputError } from "../error.js"; + +export async function getGithubPointer( + args: GithubFetchArgs, + eventType: EventType, +): Promise<[Artifact, GithubEventPointer]> { + const { org, repo } = args; + + if (!org) { + throw new InvalidInputError("Missing required argument: org"); + } + + if (!repo) { + throw new InvalidInputError("Missing required argument: org"); + } + + const dbOrg = await prisma.organization.findFirst({ + where: { name: args.org }, + }); + + if (!dbOrg) { + throw new InvalidInputError(`No org matching ${args.org}`); + } + + const dbArtifact = await prisma.artifact.findFirst({ + where: { + AND: [ + { + name: args.repo, + organizationId: dbOrg.id, + }, + ], + }, + }); + + if (!dbArtifact) { + throw new InvalidInputError( + `No artifact matching ${args.org} and ${args.repo}`, + ); + } + + const pointer = await prisma.eventSourcePointer.findFirst({ + where: { + AND: [ + { + artifactId: dbArtifact.id, + }, + { + eventType: eventType, + }, + ], + }, + }); + + if (!pointer) { + throw new Error(`No pointer found for artifact and event type`); + } + + return [dbArtifact, pointer.pointer as any]; +} diff --git a/indexer/src/utils/github/getOrgRepos.ts b/indexer/src/utils/github/getOrgRepos.ts new file mode 100644 index 000000000..dd12b5ad6 --- /dev/null +++ b/indexer/src/utils/github/getOrgRepos.ts @@ -0,0 +1,75 @@ +import { gql } from "graphql-request"; +import { unpaginate } from "./unpaginate.js"; + +const query = gql` + query getOrgRepos($name: String!, $cursor: String) { + rateLimit { + limit + cost + remaining + resetAt + } + organization(login: $name) { + id + createdAt + repositories(first: 100, after: $cursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + nameWithOwner + url + name + } + } + } + } + } +`; + +interface Data { + rateLimit: { + limit: number; + cost: number; + remaining: number; + resetAt: string; + }; + organization: { + id: string; + createdAt: string; + repositories: { + pageInfo: { + hasNextPage: boolean; + endCursor: string; + }; + edges: [ + { + node: Repository; + }, + ]; + }; + }; +} + +export interface Repository { + nameWithOwner: string; + url: string; + name: string; +} + +export async function getOrgRepos(orgName: string): Promise { + const variables = { + name: orgName, + }; + + const nodes = await unpaginate()( + query, + "organization.repositories.edges", + "organization.repositories.pageInfo", + variables, + ); + + return nodes.map((node) => node.node); +} diff --git a/indexer/src/utils/github/getRepoIusses.ts b/indexer/src/utils/github/getRepoIusses.ts new file mode 100644 index 000000000..862cf379b --- /dev/null +++ b/indexer/src/utils/github/getRepoIusses.ts @@ -0,0 +1,136 @@ +import { gql } from "graphql-request"; +import { unpaginate } from "./unpaginate.js"; + +export const query = gql` + query getRepoIssues($searchString: String!, $cursor: String) { + rateLimit { + limit + cost + remaining + resetAt + } + search(query: $searchString, first: 100, type: ISSUE, after: $cursor) { + pageInfo { + hasNextPage + endCursor + } + nodes { + ... on Issue { + createdAt + closedAt + author { + login + } + title + url + state + stateReason + } + } + } + } +`; + +interface Data { + search: { + pageInfo: { + hasNextPage: boolean; + endCursor: string | null; + }; + nodes: Issue[]; + }; +} + +interface Issue { + createdAt: string; + closedAt: string | null; + author: { + login: string; + }; + title: string; + url: string; + state: string; + stateReason: string | null; +} + +export function formatGithubDate(date: Date): string { + const ye = new Intl.DateTimeFormat("en", { + timeZone: "GMT", + year: "numeric", + }).format(date); + const mo = new Intl.DateTimeFormat("en", { + timeZone: "GMT", + month: "2-digit", + }).format(date); + const da = new Intl.DateTimeFormat("en", { + timeZone: "GMT", + day: "2-digit", + }).format(date); + const ho = new Intl.DateTimeFormat("en", { + timeZone: "GMT", + hour: "2-digit", + hour12: false, + }).format(date); + const mi = new Intl.DateTimeFormat("en", { + timeZone: "GMT", + minute: "2-digit", + }) + .format(date) + .padStart(2, "0"); + const se = new Intl.DateTimeFormat("en", { + timeZone: "GMT", + second: "2-digit", + }) + .format(date) + .padStart(2, "0"); + + return `${ye}-${mo}-${da}T${ho}:${mi}:${se}Z`; +} + +export async function getRepoIssuesFiled( + repoNameWithOwner: string, + startDate: Date, + currentDate: Date, +): Promise { + const startDateStr = formatGithubDate(startDate); + const currentDateStr = formatGithubDate(currentDate); + + const searchString = `repo:${repoNameWithOwner} is:issue -reason:NOT_PLANNED created:${startDateStr}..${currentDateStr}`; + + const variables = { + searchString, + }; + + const issues = await unpaginate()( + query, + "search.nodes", + "search.pageInfo", + variables, + ); + + return issues; +} + +export async function getRepoIssuesClosed( + repoNameWithOwner: string, + startDate: Date, + currentDate: Date, +): Promise { + const startDateStr = formatGithubDate(startDate); + const currentDateStr = formatGithubDate(currentDate); + + const searchString = `repo:${repoNameWithOwner} is:issue -reason:NOT_PLANNED closed:${startDateStr}..${currentDateStr}`; + + const variables = { + searchString, + }; + + const issues = await unpaginate()( + query, + "search.nodes", + "search.pageInfo", + variables, + ); + + return issues; +} diff --git a/indexer/src/utils/github/getRepositoryCreatedAt.ts b/indexer/src/utils/github/getRepositoryCreatedAt.ts new file mode 100644 index 000000000..630cbb18c --- /dev/null +++ b/indexer/src/utils/github/getRepositoryCreatedAt.ts @@ -0,0 +1,28 @@ +import { gql } from "graphql-request"; +import { graphQLClient } from "./graphQLClient.js"; + +const query = gql` + query getRepositoryCreatedAt($owner: String!, $name: String!) { + repository(owner: $owner, name: $name) { + createdAt + } + } +`; + +interface Data { + repository: { + createdAt: string; + }; +} + +export async function getRepositoryCreatedAt( + owner: string, + name: string, +): Promise { + const data = await graphQLClient.request(query, { + owner, + name, + }); + + return data.repository.createdAt; +} diff --git a/indexer/src/utils/github/graphQLClient.ts b/indexer/src/utils/github/graphQLClient.ts new file mode 100644 index 000000000..2f66045ff --- /dev/null +++ b/indexer/src/utils/github/graphQLClient.ts @@ -0,0 +1,8 @@ +import { GraphQLClient } from "graphql-request"; +import { GITHUB_GRAPHQL_API, GITHUB_TOKEN } from "../../config.js"; + +export const graphQLClient = new GraphQLClient(GITHUB_GRAPHQL_API, { + headers: { + authorization: `Bearer ${GITHUB_TOKEN}`, + }, +}); diff --git a/indexer/src/utils/github/unpaginate.ts b/indexer/src/utils/github/unpaginate.ts new file mode 100644 index 000000000..b16816b66 --- /dev/null +++ b/indexer/src/utils/github/unpaginate.ts @@ -0,0 +1,68 @@ +import { graphQLClient } from "./graphQLClient.js"; + +import { Path, Choose, getPath } from "../getPath.js"; + +type PageInfo = { + hasNextPage: boolean; + endCursor: string; +}; + +// TODO: return type should error if not array +// TODO: pageInfoPath should locate a PageInfo object +// type HasPageInfo, K extends Path> = Choose extends PageInfo ? K : never; + +// typescript can't infer T because it's not passed in (like in getPath), and K can't be inferred precisely without writing +// out the entire path again. So we curry the function. Sorry for the mess... +export function unpaginate>() { + return async function , A extends Path>( + query: string, + dataPath: K, + pageInfoPath: A, + variables: any = {}, + ): Promise extends Array ? Choose : never> { + let cursor = null; + const items: any[] = []; + + /* eslint-disable-next-line no-constant-condition */ + while (true) { + const data = await graphQLClient.request(query, { + ...variables, + cursor: cursor, + }); + + const newItems: any[] = getPath(data, dataPath); + items.push(...newItems); + + const pageInfo: PageInfo = getPath(data, pageInfoPath); + if (!pageInfo.hasNextPage) { + break; + } + + cursor = pageInfo.endCursor; + + const rateLimit: RateLimit = data.rateLimit; + + if ( + rateLimit.remaining == 0 || + rateLimit.remaining - rateLimit.cost <= 0 + ) { + const timeToReset = Date.parse(rateLimit.resetAt) - Date.now() + 1000; + console.log(`sleeping until rate limet reset for ${timeToReset}ms`); + await sleep(timeToReset); + } + } + + return items as any; + }; +} + +function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +interface RateLimit { + limit: number; + cost: number; + remaining: number; + resetAt: string; +} diff --git a/indexer/src/utils/logger.ts b/indexer/src/utils/logger.ts new file mode 100644 index 000000000..1fe11d746 --- /dev/null +++ b/indexer/src/utils/logger.ts @@ -0,0 +1,18 @@ +import winston from "winston"; + +export const logger = winston.createLogger({ + level: "info", + format: winston.format.json(), + defaultMeta: {}, + transports: [ + new winston.transports.Console({ + format: winston.format.printf( + (info) => `${info.message}`, + //info => `${moment().format("HH:mm:ss")}:${info.level}\t${info.message}` + ), + stderrLevels: ["error"], + }), + //new winston.transports.File({ filename: "error.log", level: "error" }), + //new winston.transports.File({ filename: "combined.log", level: "info" }), + ], +}); diff --git a/indexer/src/utils/parsing.ts b/indexer/src/utils/parsing.ts new file mode 100644 index 000000000..4129c7243 --- /dev/null +++ b/indexer/src/utils/parsing.ts @@ -0,0 +1,27 @@ +export interface ParseGitHubUrlResult { + owner: string; + name: string; +} + +/** + * Parse a GitHub URL into its owner and name + * @param url + * @returns null if invalid input, otherwise the results + */ +export function parseGithubUrl(url: any): ParseGitHubUrlResult | null { + if (typeof url !== "string") { + return null; + } + + // eslint-disable-next-line no-useless-escape + const regex = /\/\/github.com\/([^/]+)\/([^\./]+)/g; + const matches = regex.exec(url); + if (!matches || matches.length < 3) { + return null; + } + + return { + owner: matches[1], + name: matches[2], + }; +} diff --git a/indexer/src/validate_eth_address.py b/indexer/src/validate_eth_address.py new file mode 100644 index 000000000..0772c9323 --- /dev/null +++ b/indexer/src/validate_eth_address.py @@ -0,0 +1,125 @@ +from dotenv import load_dotenv +import os +import requests + +from ens import ENS +from web3 import Web3 + + +load_dotenv() +ALCHEMY_KEY = os.environ['ALCHEMY_KEY'] +ALCHEMY_KEY_OP = os.environ['ALCHEMY_KEY_OP'] +ETHERSCAN_OP = os.environ['ETHERSCAN_KEY_OP'] + +# create a web3 connection +mainnet_url = f"https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}" +w3 = Web3(Web3.HTTPProvider(mainnet_url)) +ns = ENS.fromWeb3(w3) + +optimism_url = f"https://opt-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY_OP}" +op = Web3(Web3.HTTPProvider(optimism_url)) + +# get hex codes for checking address/wallet types + +# TODO: map Optimism contracts + +SPLITS_CODE = w3.eth.get_code("0xD2584c1CF7E3fF11957195732d380DC886F5f05b") +EOA_CODE = w3.eth.get_code("0xEAF9830bB7a38A3CEbcaCa3Ff9F626C424F3fB55") +SAFES = [ + w3.eth.get_code(Web3.toChecksumAddress(x.lower())) + for x in [ + "0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd", + "0x7DAC9Fc15C1Db4379D75A6E3f330aE849dFfcE18", + "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775" + ] +] + +def get_ens(addr): + try: + return ns.name(addr) + except: + return None + + +def get_address_type(addr): + + try: + code = w3.eth.get_code(addr) + except: + return "Unknown" + if code == EOA_CODE: + return "EOA" + if code == SPLITS_CODE: + return "0xSplits" + if code in SAFES: + return "Safe" + return "Unknown" + + +def get_transaction_count(client, addr): + try: + return client.eth.get_transaction_count(addr) + except: + return None + + +def lookup_op_contract(addr): + headers = {'Accept': 'application/json'} + url = "&".join([ + "https://api-optimistic.etherscan.io/api?module=contract&action=getcontractcreation", + f"contractaddresses={addr}", + f"apikey={ETHERSCAN_OP}" + ]) + response = requests.get(url, headers=headers).json() + if response['status'] == '1': + return response['result'][0]['contractAddress'] + else: + return None + + +def get_address_data(address, tx_count=False): + + def checksum(a): + try: + return Web3.toChecksumAddress(a.lower()) + except Exception as e: + print(e) + return None + + + result = { + 'address': None, + 'type': None, + 'ens': None + } + + if not isinstance(address, str): + result.update({ + 'type': "Missing" + }) + elif "oeth:" in address: + address = address.replace("oeth:","") + result.update({ + 'address': address, + 'type': "Safe (OP)" + }) + elif len(address) == 42: + address = checksum(address) + result.update({ + 'address': address, + 'type': get_address_type(address), + 'ens': get_ens(address) + }) + else: + result.update({ + 'type': "Needs Review" + }) + + if tx_count: + result.update(dict( + eth_count=get_transaction_count(w3, address), + op_count=get_transaction_count(op, address) + )) + + return result + diff --git a/indexer/src/validate_github_org.py b/indexer/src/validate_github_org.py new file mode 100644 index 000000000..f14f19150 --- /dev/null +++ b/indexer/src/validate_github_org.py @@ -0,0 +1,44 @@ +from dotenv import load_dotenv +import os +import requests + + +def validate_github_org(owner): + + load_dotenv() + token = os.getenv('GITHUB_TOKEN') + + query = """ + query ($owner: String!) { + organization(login: $owner) { + repositories(first: 10) { + nodes { + name + url + } + } + } + } + """ + headers = {'Authorization': f'token {token}'} + variables = {'owner': owner} + response = requests.post( + 'https://api.github.com/graphql', + json={'query': query, 'variables': variables}, + headers=headers + ) + try: + response_json = response.json() + response.raise_for_status() + data = response_json['data'] + except: + print(f"Encountered error retrieving repos for https://github.com/{owner}.") + print(response_json) + return False + + org = data.get('organization') + if org: + return True + + print(f"No valid organization / repositories found for https://github.com/{owner}") + return False diff --git a/indexer/supabase/.gitignore b/indexer/supabase/.gitignore new file mode 100644 index 000000000..773c7c3e0 --- /dev/null +++ b/indexer/supabase/.gitignore @@ -0,0 +1,3 @@ +# Supabase +.branches +.temp diff --git a/indexer/supabase/config.toml b/indexer/supabase/config.toml new file mode 100644 index 000000000..23036f124 --- /dev/null +++ b/indexer/supabase/config.toml @@ -0,0 +1,82 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the working +# directory name when running `supabase init`. +project_id = "os-observer" + +[api] +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. public and storage are always included. +schemas = ["public", "storage", "graphql_public"] +# Extra schemas to add to the search_path of every request. public is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[db] +# Port to use for the local database URL. +port = 54322 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[studio] +# Port to use for Supabase Studio. +port = 54323 + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +# Port to use for the email testing server web interface. +port = 54324 +smtp_port = 54325 +pop3_port = 54326 + +[storage] +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[auth] +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://localhost:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://localhost:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one +# week). +jwt_expiry = 3600 +# Allow/disallow new user signups to your project. +enable_signup = true + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +secret = "" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" + +[analytics] +enabled = false +port = 54327 +vector_port = 54328 +# Setup BigQuery project to enable log viewer on local development stack. +# See: https://supabase.com/docs/guides/getting-started/local-development#enabling-local-logging +gcp_project_id = "" +gcp_project_number = "" +gcp_jwt_path = "supabase/gcloud.json" diff --git a/indexer/supabase/seed.sql b/indexer/supabase/seed.sql new file mode 100644 index 000000000..e69de29bb diff --git a/indexer/test/events/npm.test.ts b/indexer/test/events/npm.test.ts new file mode 100644 index 000000000..2f8327bb6 --- /dev/null +++ b/indexer/test/events/npm.test.ts @@ -0,0 +1,87 @@ +import _ from "lodash"; +import dayjs from "dayjs"; +import { + hasDuplicates, + getMissingDays, + formatDate, +} from "../../src/events/npm.js"; + +const makeData = (dateStrings: string[]) => + dateStrings.map((dateString) => ({ + downloads: _.random(0, 1000), + day: dateString, + })); + +describe("npm tests", () => { + it("hasDuplicates - works", () => { + const result = hasDuplicates( + makeData(["2021-01-01", "2021-01-01", "2021-01-03"]), + ); + expect(result).toEqual(true); + }); + + it("hasDuplicates - no false positives", () => { + const result = hasDuplicates( + makeData(["2021-01-01", "2021-01-02", "2021-01-03"]), + ); + expect(result).toEqual(false); + }); + + it("hasMissingDays - works", () => { + let result = getMissingDays( + makeData(["2021-01-01", "2021-01-02", "2021-01-03"]), + dayjs("2021-01-01"), + dayjs("2021-01-03"), + ); + expect(result.length).toEqual(0); + result = getMissingDays( + makeData(["2021-01-01", "2021-01-03"]), + dayjs("2021-01-01"), + dayjs("2021-01-03"), + ); + expect(result.length).toEqual(1); + expect(result.map(formatDate)).toEqual( + expect.arrayContaining(["2021-01-02"]), + ); + }); + + it("hasMissingDays - start must not be after end date", () => { + expect(() => { + getMissingDays( + makeData(["2021-01-01", "2021-01-02", "2021-01-03"]), + dayjs("2021-01-04"), + dayjs("2021-01-03"), + ); + }).toThrow(); + }); + + it("hasMissingDays - treats dates inclusively", () => { + let result = getMissingDays( + makeData(["2021-01-01", "2021-01-02", "2021-01-03"]), + dayjs("2021-01-01"), + dayjs("2021-01-04"), + ); + expect(result.length).toEqual(1); + expect(result.map(formatDate)).toEqual( + expect.arrayContaining(["2021-01-04"]), + ); + result = getMissingDays( + makeData(["2021-01-01", "2021-01-02", "2021-01-03"]), + dayjs("2020-12-31"), + dayjs("2021-01-03"), + ); + expect(result.length).toEqual(1); + expect(result.map(formatDate)).toEqual( + expect.arrayContaining(["2020-12-31"]), + ); + }); + + it("hasMissingDays - works across months and years", () => { + const result = getMissingDays( + makeData(["2021-12-31", "2022-01-01", "2022-01-02"]), + dayjs("2021-12-31"), + dayjs("2022-01-02"), + ); + expect(result.length).toEqual(0); + }); +}); diff --git a/indexer/test/utils/parsing.test.ts b/indexer/test/utils/parsing.test.ts new file mode 100644 index 000000000..930ed7d94 --- /dev/null +++ b/indexer/test/utils/parsing.test.ts @@ -0,0 +1,44 @@ +import { parseGithubUrl } from "../../src/utils/parsing.js"; + +describe("parsing", () => { + it("parses github git+https urls", () => { + const url = "git+https://github.com/hypercerts-org/hypercerts.git"; + const result = parseGithubUrl(url); + expect(result).not.toBeNull(); + expect(result?.owner).toEqual("hypercerts-org"); + expect(result?.name).toEqual("hypercerts"); + }); + + it("parses github ssh urls", () => { + const url = "ssh://github.com/hypercerts-org/hypercerts.git"; + const result = parseGithubUrl(url); + expect(result).not.toBeNull(); + expect(result?.owner).toEqual("hypercerts-org"); + expect(result?.name).toEqual("hypercerts"); + }); + + it("parses multi-part github ssh urls", () => { + const url = "ssh://github.com/hypercerts-org/hypercerts/sdk"; + const result = parseGithubUrl(url); + expect(result).not.toBeNull(); + expect(result?.owner).toEqual("hypercerts-org"); + expect(result?.name).toEqual("hypercerts"); + }); + + it("doesn't parse gitlab ssh urls", () => { + const url = "ssh://gitlab.com/hypercerts-org/hypercerts.git"; + const result = parseGithubUrl(url); + expect(result).toBeNull(); + }); + + it("doesn't parse malformed urls", () => { + const url = "hypercerts-org/hypercerts.git"; + const result = parseGithubUrl(url); + expect(result).toBeNull(); + }); + + it("doesn't parse falsey values", () => { + const result = parseGithubUrl(false); + expect(result).toBeNull(); + }); +}); diff --git a/indexer/tsconfig.json b/indexer/tsconfig.json new file mode 100644 index 000000000..33f712fbe --- /dev/null +++ b/indexer/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "outDir": "dist", + "target": "ES6", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "noImplicitAny": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "strictNullChecks": true + }, + "exclude": ["node_modules"], + "include": ["./src/*.ts", "./src/**/*.ts", "./test"] +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..af8b4e7b5 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "oso", + "description": "Impact measurement for open source software", + "version": "0.0.0", + "author": "Hypercerts Foundation", + "license": "Apache-2.0", + "private": true, + "workspaces": { + "packages": [ + "docs", + "frontend", + "indexer" + ] + }, + "scripts": { + "build": "turbo run build --concurrency=100%", + "build:frontend": "turbo run build --filter=@hypercerts-org/frontend", + "build:docs": "turbo run build --filter=@hypercerts-org/docs", + "copy": "yarn copy:frontend && yarn copy:docs && yarn copy:html", + "copy:docs": "mkdir -p ./build/docs/ && cp -r ./docs/build/* ./build/docs/", + "copy:frontend": "mkdir -p ./build/ && cp -r ./frontend/out/* ./build/ && cp ./frontend/_redirects ./build/", + "copy:html": "find build/ -name '*.html' -type f | grep -v index.html | sed s/\\.html$// | xargs -I _ bash -c 'mkdir -p _ && cp -v _.html _/index.html'", + "deploy:indexer": "turbo run deploy --filter=@hypercerts-org/indexer --parallel", + "deploy:site": "turbo run build --filter=@hypercerts-org/docs --filter=hypercerts-protocol && turbo run deploy --filter=@hypercerts-org/frontend && yarn copy", + "dev:frontend": "turbo run dev --filter=@hypercerts-org/frontend --parallel", + "format:staged": "lint-staged", + "lint": "turbo run lint --concurrency=100%", + "serve": "yarn serve build", + "start:indexer": "turbo run start --filter=@hypercerts-org/indexer --", + "test": "turbo run test --concurrency=1", + "prepare": "husky install" + }, + "devDependencies": { + "husky": "^8.0.3", + "lint-staged": "^13.2.3", + "prettier": "^3.0.0", + "turbo": "^1.10.12" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hypercerts-org/oso.git" + } +} diff --git a/turbo.json b/turbo.json new file mode 100644 index 000000000..244df5b2e --- /dev/null +++ b/turbo.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://turbo.build/schema.json", + "globalDependencies": ["**/.env.*local", "**.env"], + "pipeline": { + "build": { + "dependsOn": ["^build"], + "outputs": ["build/**", "dist/**", "out/**", ".docusaurus", ".next/**"] + }, + "deploy": { + "dependsOn": ["build"], + "outputs": ["build/**", "dist/**", "out/**", ".docusaurus", ".next/**"] + }, + "dev": { + "persistent": true + }, + "lint": {}, + "sentry:sourcemaps": {}, + "start": { + "cache": false + }, + "test": {}, + "@hypercerts-org/frontend#build": { + "dependsOn": ["^build"], + "outputs": ["out/**", ".next/**"], + "env": ["PLASMIC_PROJECT_ID", "PLASMIC_PROJECT_API_TOKEN"], + "cache": false + } + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..a2982675c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6382 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adobe/css-tools@^4.0.1": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + 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" + +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.7.2": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + 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" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + 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" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.20.7", "@babel/runtime@^7.9.2": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + 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" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.1": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== + 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" + +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== + +"@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.2.tgz#bf1d4101347c23e07c029a1b1ae07d550f5cc541" + integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" + +"@jest/core@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.2.tgz#6f2d1dbe8aa0265fcd4fb8082ae1952f148209c8" + integrity sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg== + dependencies: + "@jest/console" "^29.6.2" + "@jest/reporters" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@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.2" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-resolve-dependencies "^29.6.2" + jest-runner "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + jest-watcher "^29.6.2" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.2.tgz#794c0f769d85e7553439d107d3f43186dc6874a9" + integrity sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q== + dependencies: + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + +"@jest/expect-utils@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.2.tgz#1b97f290d0185d264dd9fdec7567a14a38a90534" + integrity sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.2.tgz#5a2ad58bb345165d9ce0a1845bbf873c480a4b28" + integrity sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg== + dependencies: + expect "^29.6.2" + jest-snapshot "^29.6.2" + +"@jest/fake-timers@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.2.tgz#fe9d43c5e4b1b901168fe6f46f861b3e652a2df4" + integrity sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA== + dependencies: + "@jest/types" "^29.6.1" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-util "^29.6.2" + +"@jest/globals@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.2.tgz#74af81b9249122cc46f1eb25793617eec69bf21a" + integrity sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/types" "^29.6.1" + jest-mock "^29.6.2" + +"@jest/reporters@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" + integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@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.2" + jest-util "^29.6.2" + jest-worker "^29.6.2" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.0.tgz#bd34a05b5737cb1a99d43e1957020ac8e5b9ddb1" + integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.2.tgz#fdd11583cd1608e4db3114e8f0cce277bf7a32ed" + integrity sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw== + dependencies: + "@jest/console" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz#585eff07a68dd75225a7eacf319780cb9f6b9bf4" + integrity sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw== + dependencies: + "@jest/test-result" "^29.6.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + slash "^3.0.0" + +"@jest/transform@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" + integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== + 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.2" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + 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" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@next/env@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.12.tgz#0b88115ab817f178bf9dc0c5e7b367277595b58d" + integrity sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ== + +"@next/eslint-plugin-next@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.12.tgz#e75c4fedd0324d4f8fa8be2eb446270a462d3092" + integrity sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A== + dependencies: + glob "7.1.7" + +"@next/swc-darwin-arm64@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.12.tgz#326c830b111de8a1a51ac0cbc3bcb157c4c4f92c" + integrity sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg== + +"@next/swc-darwin-x64@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.12.tgz#dd5c49fc092a8ffe4f30b7aa9bf6c5d2e40bbfa1" + integrity sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ== + +"@next/swc-linux-arm64-gnu@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.12.tgz#816cbe9d26ce4670ea99d95b66041e483ed122d6" + integrity sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig== + +"@next/swc-linux-arm64-musl@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.12.tgz#670c8aee221628f65e5b299ee84db746e6c778b0" + integrity sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g== + +"@next/swc-linux-x64-gnu@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.12.tgz#54c64e689f007ae463698dddc1c6637491c99cb4" + integrity sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg== + +"@next/swc-linux-x64-musl@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.12.tgz#9cbddf4e542ef3d32284e0c36ce102facc015f8b" + integrity sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ== + +"@next/swc-win32-arm64-msvc@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.12.tgz#3467a4b25429ccf49fd416388c9d19c80a4f6465" + integrity sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA== + +"@next/swc-win32-ia32-msvc@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.12.tgz#73494cd167191946833c680b28d6a42435d383a8" + integrity sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww== + +"@next/swc-win32-x64-msvc@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.12.tgz#4a497edc4e8c5ee3c3eb27cf0eb39dfadff70874" + integrity sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/utils@^2.3.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" + integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.3.0" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.6.0" + +"@plasmicapp/data-sources-context@0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@plasmicapp/data-sources-context/-/data-sources-context-0.1.11.tgz#30765e1eff677ac06d0ec6e8d0cecdbf8759f9bc" + integrity sha512-JFrtPCjdLIRnmZujWFuh025Id4bgd2fwllOOm2qMo4yoSm4oGDg6/2rRpD0qRC6DiN47RGt8tDR+ancYboxPjw== + +"@plasmicapp/host@1.0.155": + version "1.0.155" + resolved "https://registry.yarnpkg.com/@plasmicapp/host/-/host-1.0.155.tgz#079650205cb3089707fba0f627e6082cca7c2f73" + integrity sha512-1LqBghRo81gYLmwE32l/Gua9AyhLdhewIeFUlccNAjVtl3YzLmWURDupebIc/ltwcStD7p9WI4G6ai7rUVjUTQ== + dependencies: + "@plasmicapp/query" "0.1.67" + csstype "^3.1.2" + window-or-global "^1.0.1" + +"@plasmicapp/isomorphic-unfetch@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@plasmicapp/isomorphic-unfetch/-/isomorphic-unfetch-1.0.2.tgz#c16450a152f54e9082302d9f77be790148336e37" + integrity sha512-Kt/uru0C07UTrnNE4C6Uu9hbtOIfDM5+lmRDJ92m11O8Yhf5HUaxxqwhw8sCco3jGLCP53LO1cnANbNDCSLtDQ== + dependencies: + node-fetch-cjs "^3.2.10" + unfetch "^4.2.0" + +"@plasmicapp/loader-core@1.0.106": + version "1.0.106" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-core/-/loader-core-1.0.106.tgz#ec68863f8f45687f85b1cf2e8b0541c24c2aa3af" + integrity sha512-tZtcH2w85mtQdd9LlE9j0nZo7pKYTsE7B3OwlgBvKTZ2pIQAj6FdCYMzdwSJN2T1jn/bfSCVPJRsXpOAV/6YQA== + dependencies: + "@plasmicapp/isomorphic-unfetch" "^1.0.1" + "@plasmicapp/loader-fetcher" "1.0.29" + +"@plasmicapp/loader-edge@1.0.35": + version "1.0.35" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-edge/-/loader-edge-1.0.35.tgz#8df93201f89174033817fa771cd87fc639b4d8bc" + integrity sha512-ph0c6uz6GHxHbGtAaeNFY63shwPDBpPU4+q2Vi9IA137FJwWf84cI1lOtpBmyz6QpqVxv2ecu5M3w9UKYHufwQ== + dependencies: + "@plasmicapp/loader-fetcher" "1.0.29" + "@plasmicapp/loader-splits" "1.0.34" + +"@plasmicapp/loader-fetcher@1.0.29": + version "1.0.29" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-fetcher/-/loader-fetcher-1.0.29.tgz#c8d4934291ccfb0bfde651a7e2d8ffe1258185f5" + integrity sha512-PuSDnmhHEJ9Pqy3RqCg/UDqEBLcBotDy/mw8no7B3uN/4EUi8M7thxubHP/jPxbeMrz1PkfFNIMLmvT4vIfyRw== + dependencies: + "@plasmicapp/isomorphic-unfetch" "^1.0.1" + +"@plasmicapp/loader-nextjs@^1.0.302": + version "1.0.302" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-nextjs/-/loader-nextjs-1.0.302.tgz#d8968131bc3cc5325ee955757c2a693bfe919c53" + integrity sha512-A/P9LmJ/60yKai49pO1MJxTrDjUp/x+vC7ar/h9lMjOyXhYYsR3PSRWSrI36fhEZnbD2e8mEIrDRjpQ6hIjJeA== + dependencies: + "@plasmicapp/loader-core" "1.0.106" + "@plasmicapp/loader-edge" "1.0.35" + "@plasmicapp/loader-react" "1.0.283" + "@plasmicapp/watcher" "1.0.72" + server-only "0.0.1" + +"@plasmicapp/loader-react@1.0.283": + version "1.0.283" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-react/-/loader-react-1.0.283.tgz#c169b8280247991440d0f7cbba80946db8255b07" + integrity sha512-oRySGX49AkTUdR3EixAVkEg8C5COVPQUeeeMmRdq5a9Q2faLnqp1jj8Tjtf+I92DAx/eZGQLjt72B9adVw7+XA== + dependencies: + "@plasmicapp/data-sources-context" "0.1.11" + "@plasmicapp/host" "1.0.155" + "@plasmicapp/loader-core" "1.0.106" + "@plasmicapp/loader-splits" "1.0.34" + "@plasmicapp/prepass" "1.0.1" + "@plasmicapp/query" "0.1.67" + pascalcase "^1.0.0" + server-only "0.0.1" + +"@plasmicapp/loader-splits@1.0.34": + version "1.0.34" + resolved "https://registry.yarnpkg.com/@plasmicapp/loader-splits/-/loader-splits-1.0.34.tgz#45998190ee77aa333db61362138efd267b480a77" + integrity sha512-7Y0HuP+bLaiUKH16kO9LPANjP4j5MaMjwsNza13G/HaS53QzjN75hB3NOK/t7XA3GHsc7cUSYND2xu3I2NQ6eg== + dependencies: + "@plasmicapp/loader-fetcher" "1.0.29" + json-logic-js "^2.0.2" + +"@plasmicapp/prepass@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@plasmicapp/prepass/-/prepass-1.0.1.tgz#05f196eda84e37189306a0997ba5d087528e620d" + integrity sha512-ivu4TSFUsdN87aNKD9MokFpLLzlI/JshQ4PzB8WpkD3RnU6lf0PEK9vHvEIMN9jLwnEx5JoyqdlhkEbBsKrS3w== + dependencies: + "@plasmicapp/query" "0.1.67" + "@plasmicapp/react-ssr-prepass" "2.0.2" + +"@plasmicapp/query@0.1.67": + version "0.1.67" + resolved "https://registry.yarnpkg.com/@plasmicapp/query/-/query-0.1.67.tgz#64515dc7782093fae5c3c741ad016fdcc9281200" + integrity sha512-BS+NrTtknKeaPhOD14K0AsUe8Mvq6qmnL/B9TE80Ac0dq1mwD7SIyptV7JGpYmiFzsO1v1XZ/RkR3jtpsKrpoQ== + dependencies: + swr "^1.0.0" + +"@plasmicapp/react-ssr-prepass@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@plasmicapp/react-ssr-prepass/-/react-ssr-prepass-2.0.2.tgz#0ebe044d4b89080cac1f3ac0a3bc152eea5b9cb5" + integrity sha512-axZF7/lVsCqsDED40VkJOjf/Iow/RjfxLjdT3IRwP8KkjsLvy06ir0IfPhXJ+7TcHOiW87f79VmR4aMwJxy0sg== + +"@plasmicapp/watcher@1.0.72": + version "1.0.72" + resolved "https://registry.yarnpkg.com/@plasmicapp/watcher/-/watcher-1.0.72.tgz#13659b46b9ef22b66532eb737b93f5e23c4d921d" + integrity sha512-aLwCbjgSymjLB/B9bvXC4ZNsBzE3Olh+IzmPH5s42c720fNleImjYolbuSlw8fl2LLWGSuCD2GJ+yaWZtaVOdg== + dependencies: + socket.io-client "^4.1.2" + +"@prisma/client@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.0.0.tgz#9f0cd4164f4ffddb28bb1811c27eb7fa1e01a087" + integrity sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ== + dependencies: + "@prisma/engines-version" "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" + +"@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584": + version "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz#b36eda5620872d3fac810c302a7e46cf41daa033" + integrity sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ== + +"@prisma/engines@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.0.0.tgz#5249650eabe77c458c90f2be97d8210353c2e22e" + integrity sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg== + +"@rushstack/eslint-patch@^1.1.3": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz#31b9c510d8cada9683549e1dbb4284cca5001faf" + integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== + dependencies: + tslib "^2.4.0" + +"@testing-library/dom@^9.0.0", "@testing-library/dom@^9.3.1": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" + integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" + integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^14.4.3": + version "14.4.3" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.4.3.tgz#af975e367743fa91989cd666666aec31a8f50591" + integrity sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + +"@types/babel__core@^7.1.14": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "29.5.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.3.tgz#7a35dc0044ffb8b56325c6802a4781a626b05777" + integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@^7.0.12": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash@^4.14.196": + version "4.14.196" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.196.tgz#a7c3d6fc52d8d71328b764e28e080b4169ec7a95" + integrity sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ== + +"@types/node-fetch@*": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*", "@types/node@^20.4.5": + version "20.4.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" + integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== + +"@types/node@^18.11.5": + version "18.17.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.1.tgz#84c32903bf3a09f7878c391d31ff08f6fe7d8335" + integrity sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw== + +"@types/npm-package-arg@*": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/npm-package-arg/-/npm-package-arg-6.1.1.tgz#9e2d8adc04d39824a3d9f36f738010a3f7da3c1a" + integrity sha512-452/1Kp9IdM/oR10AyqAgZOxUt7eLbm+EMJ194L6oarMYdZNiFIFAOJ7IIr0OrZXTySgfHjJezh2oiyk2kc3ag== + +"@types/npm-registry-fetch@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@types/npm-registry-fetch/-/npm-registry-fetch-8.0.4.tgz#77b2737cde22314ccda1dfdb9568fd7769e95b90" + integrity sha512-R9yEj6+NDmXLpKNS19cIaMyaHfV0aHjy/1qbo8K9jiHyjyaYg0CEmuOV/L0Q91DZDi3SuxlYY+2XYwh9TbB+eQ== + dependencies: + "@types/node" "*" + "@types/node-fetch" "*" + "@types/npm-package-arg" "*" + "@types/npmlog" "*" + "@types/ssri" "*" + +"@types/npmlog@*": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.4.tgz#30eb872153c7ead3e8688c476054ddca004115f6" + integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== + +"@types/papaparse@^5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.3.7.tgz#8d3bf9e62ac2897df596f49d9ca59a15451aa247" + integrity sha512-f2HKmlnPdCvS0WI33WtCs5GD7X1cxzzS/aduaxSu3I7TbhWlENjSPs6z5TaB9K0J+BH1jbmqTaM+ja5puis4wg== + dependencies: + "@types/node" "*" + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@^6.9.7": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.7": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.17": + version "18.2.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.17.tgz#baa565b17ddb649c2dac85b5eaf9e9a1fe0f3b4e" + integrity sha512-u+e7OlgPPh+aryjOm5UJMX32OvB2E3QASOAqVMY6Ahs90djagxwv2ya0IctglNbNTexC12qCSMZG47KPfy1hAA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/ssri@*": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/ssri/-/ssri-7.1.1.tgz#2a2c94abf0d3a8c3b07bb4ff08142dd571407bb5" + integrity sha512-DPP/jkDaqGiyU75MyMURxLWyYLwKSjnAuGe9ZCsLp9QZOpXmDfuevk769F0BS86TmRuD5krnp06qw9nSoNO+0g== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/testing-library__jest-dom@^5.14.9", "@types/testing-library__jest-dom@^5.9.1": + version "5.14.9" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== + dependencies: + "@types/jest" "*" + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/triple-beam@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz#38ecb64f01aa0d02b7c8f4222d7c38af6316fef8" + integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz#57047c400be0632d4797ac081af8d399db3ebc3b" + integrity sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.2.0" + "@typescript-eslint/type-utils" "6.2.0" + "@typescript-eslint/utils" "6.2.0" + "@typescript-eslint/visitor-keys" "6.2.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + natural-compare-lite "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^5.42.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + 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" + +"@typescript-eslint/parser@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.2.0.tgz#d37c30b0f459c6f39455335d8f4f085919a1c644" + integrity sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g== + dependencies: + "@typescript-eslint/scope-manager" "6.2.0" + "@typescript-eslint/types" "6.2.0" + "@typescript-eslint/typescript-estree" "6.2.0" + "@typescript-eslint/visitor-keys" "6.2.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz#412a710d8fa20bc045533b3b19f423810b24f87a" + integrity sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q== + dependencies: + "@typescript-eslint/types" "6.2.0" + "@typescript-eslint/visitor-keys" "6.2.0" + +"@typescript-eslint/type-utils@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz#02b27a3eeb41aa5460d6275d12cce5dd72e1c9fc" + integrity sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw== + dependencies: + "@typescript-eslint/typescript-estree" "6.2.0" + "@typescript-eslint/utils" "6.2.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.2.0.tgz#b341a4e6d5f609267306b07afc6f62bcf92b1495" + integrity sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + 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" + +"@typescript-eslint/typescript-estree@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz#4969944b831b481996aa4fbd73c7164ca683b8ef" + integrity sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w== + dependencies: + "@typescript-eslint/types" "6.2.0" + "@typescript-eslint/visitor-keys" "6.2.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.2.0.tgz#606a20e5c13883c2d2bd0538ddc4b96b8d410979" + integrity sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.2.0" + "@typescript-eslint/types" "6.2.0" + "@typescript-eslint/typescript-estree" "6.2.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz#71943f42fdaa2ec86dc3222091f41761a49ae71a" + integrity sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ== + dependencies: + "@typescript-eslint/types" "6.2.0" + eslint-visitor-keys "^3.4.1" + +"@zeit/schemas@2.29.0": + version "2.29.0" + resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.29.0.tgz#a59ae6ebfdf4ddc66a876872dd736baa58b6696c" + integrity sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.1.0, acorn@^8.4.1, acorn@^8.8.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +add@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" + integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +arg@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + 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" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-jest@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.2.tgz#cada0a59e07f5acaeb11cbae7e3ba92aec9c1126" + integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== + dependencies: + "@jest/transform" "^29.6.2" + "@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" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + 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" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + 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" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +bin-links@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.2.tgz#13321472ea157e9530caded2b7281496d698665b" + integrity sha512-jxJ0PbXR8eQyPlExCvCs3JFnikvs1Yp4gUJt6nmgathdOwvur+q22KWC3h20gvWl4T/14DXKj2IlkJwwZkZPOw== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + +boxen@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.0.0.tgz#9e5f8c26e716793fc96edcf7cf754cdf5e3fbf32" + integrity sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.0" + chalk "^5.0.1" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001503: + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== + +chalk-template@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== + dependencies: + chalk "^4.1.2" + +chalk@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.1, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +clipboardy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" + integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== + dependencies: + arch "^2.2.0" + execa "^5.1.1" + is-wsl "^2.2.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +cmd-shim@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +dayjs@^1.11.9: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.3.0.tgz#15d6809eb15b581d5587a2dc208f34118e35bee3" + integrity sha512-7glNLfvdsMzZm3FpRY1CHuI2lbYDR+71YmrhmTZjYFD5pfT0ACgnGRdrrC9Mk2uICnzkcdelCx5at787UDGOvg== + +deep-equal@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.1" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + +duplexer@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.431: + version "1.4.475" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.475.tgz#2fee0e2a70cc1538b94f7f90aabcc436e4dcc827" + integrity sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +engine.io-client@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.1.tgz#1735fb8ae3bae5ae13115e18d2f484daf005dd9c" + integrity sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.1.0" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.1.0.tgz#d593d6372d7f79212df48f807b8cace1ea1cb1b8" + integrity sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w== + +enhanced-resolve@^5.12.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + 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-array-concat "^1.0.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-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-next@13.4.12: + version "13.4.12" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.12.tgz#a42ed2f590855a0481c8bbec49e26db56ad3793f" + integrity sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g== + dependencies: + "@next/eslint-plugin-next" "13.4.12" + "@rushstack/eslint-patch" "^1.1.3" + "@typescript-eslint/parser" "^5.42.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.26.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.31.7" + eslint-plugin-react-hooks "5.0.0-canary-7118f5dd7-20230705" + +eslint-config-prettier@^8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz#094b6254b2804b0544f7cee535f802b6d29ee10b" + integrity sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA== + +eslint-config-react@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/eslint-config-react/-/eslint-config-react-1.1.7.tgz#a0918d0fc47d0e9bd161a47308021da85d2585b3" + integrity sha512-P4Z6u68wf0BvIvZNu+U8uQsk3DcZ1CcCI1XpUkJlG6vOa+iVcSQLgE01f2DB2kXlKRcT8/3dsH+wveLgvEgbkQ== + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-import-resolver-typescript@^3.5.2: + version "3.5.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + synckit "^0.8.5" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.26.0: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + 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" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: + version "5.0.0-canary-7118f5dd7-20230705" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd" + integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== + +eslint-plugin-react@^7.31.7: + version "7.33.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz#6c356fb0862fec2cd1b04426c669ea746e9b6eb3" + integrity sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.2.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" + integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@8.45.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== + 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" + +espree@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +execa@^7.0.0, execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521" + integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== + dependencies: + "@jest/expect-utils" "^29.6.2" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.2.tgz#831879a5e6c2aa24fe79b60340e2233a1e0f472e" + integrity sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^10.2.2: + version "10.3.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b" + integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + +globby@^13.1.3: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +graphql-request@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql@^16.7.1: + version "16.7.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.7.1.tgz#11475b74a7bff2aefd4691df52a0eca0abd9b642" + integrity sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@0.6.3, iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-port-reachable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-4.0.0.tgz#dac044091ef15319c8ab2f34604d8794181f8c2d" + integrity sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + 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" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^2.0.3: + version "2.2.2" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.2.tgz#707c62733924b8dc2a0a629dc6248577788b5385" + integrity sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.2.tgz#1e6ffca60151ac66cad63fce34f443f6b5bb4258" + integrity sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.6.2" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + p-limit "^3.1.0" + pretty-format "^29.6.2" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.2.tgz#edb381763398d1a292cd1b636a98bfa5644b8fda" + integrity sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q== + dependencies: + "@jest/core" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@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.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.2.tgz#c68723f06b31ca5e63030686e604727d406cd7c3" + integrity sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.6.2" + "@jest/types" "^29.6.1" + babel-jest "^29.6.2" + 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.2" + jest-environment-node "^29.6.2" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-runner "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.2.tgz#c36001e5543e82a0805051d3ceac32e6825c1c46" + integrity sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.2.tgz#c9e4b340bcbe838c73adf46b76817b15712d02ce" + integrity sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw== + dependencies: + "@jest/types" "^29.6.1" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.6.2" + pretty-format "^29.6.2" + +jest-environment-jsdom@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.2.tgz#4fc68836a7774a771819a2f980cb47af3b1629da" + integrity sha512-7oa/+266AAEgkzae8i1awNEfTfjwawWKLpiw2XesZmaoVVj9u9t8JOYx18cG29rbPNtkUlZ8V4b5Jb36y/VxoQ== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.6.2" + jest-util "^29.6.2" + jsdom "^20.0.0" + +jest-environment-node@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.2.tgz#a9ea2cabff39b08eca14ccb32c8ceb924c8bb1ad" + integrity sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + jest-util "^29.6.2" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" + integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== + 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.2" + jest-worker "^29.6.2" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz#e2b307fee78cab091c37858a98c7e1d73cdf5b38" + integrity sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-matcher-utils@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz#39de0be2baca7a64eacb27291f0bd834fea3a535" + integrity sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-message-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.2.tgz#af7adc2209c552f3f5ae31e77cf0a261f23dc2bb" + integrity sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ== + 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.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.2.tgz#ef9c9b4d38c34a2ad61010a021866dad41ce5e00" + integrity sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-util "^29.6.2" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz#36435269b6672c256bcc85fb384872c134cc4cf2" + integrity sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.6.2" + +jest-resolve@^29.5.0, jest-resolve@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.2.tgz#f18405fe4b50159b7b6d85e81f6a524d22afb838" + integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-pnp-resolver "^1.2.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.2.tgz#89e8e32a8fef24781a7c4c49cd1cb6358ac7fc01" + integrity sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w== + dependencies: + "@jest/console" "^29.6.2" + "@jest/environment" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@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.2" + jest-haste-map "^29.6.2" + jest-leak-detector "^29.6.2" + jest-message-util "^29.6.2" + jest-resolve "^29.6.2" + jest-runtime "^29.6.2" + jest-util "^29.6.2" + jest-watcher "^29.6.2" + jest-worker "^29.6.2" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.2.tgz#692f25e387f982e89ab83270e684a9786248e545" + integrity sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/globals" "^29.6.2" + "@jest/source-map" "^29.6.0" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@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.2" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.2.tgz#9b431b561a83f2bdfe041e1cab8a6becdb01af9c" + integrity sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA== + 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.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.6.2" + graceful-fs "^4.2.9" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + natural-compare "^1.4.0" + pretty-format "^29.6.2" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.2.tgz#8a052df8fff2eebe446769fd88814521a517664d" + integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== + 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" + +jest-validate@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.2.tgz#25d972af35b2415b83b1373baf1a47bb266c1082" + integrity sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg== + 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.2" + +jest-watcher@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.2.tgz#77c224674f0620d9f6643c4cfca186d8893ca088" + integrity sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA== + dependencies: + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.6.2" + string-length "^4.0.1" + +jest-worker@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" + integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== + dependencies: + "@types/node" "*" + jest-util "^29.6.2" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.2.tgz#3bd55b9fd46a161b2edbdf5f1d1bd0d1eab76c42" + integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== + dependencies: + "@jest/core" "^29.6.2" + "@jest/types" "^29.6.1" + import-local "^3.0.2" + jest-cli "^29.6.2" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-logic-js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/json-logic-js/-/json-logic-js-2.0.2.tgz#b613e095f5e598cb78f7b9a2bbf638e74cf98158" + integrity sha512-ZBtBdMJieqQcH7IX/LaBsr5pX+Y5JIW+EhejtM3Ffg2jdN9Iwf+Ht6TbHnvAZ/YtwyuhPaCBlnvzrwVeWdvGDQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^13.2.3: + version "13.2.3" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.3.tgz#f899aad6c093473467e9c9e316e3c2d8a28f87a7" + integrity sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg== + dependencies: + chalk "5.2.0" + cli-truncate "^3.1.0" + commander "^10.0.0" + debug "^4.3.4" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.3" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.2.2" + +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.19" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.8.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +logform@^2.3.2, logform@^2.4.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b" + integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== + dependencies: + "@colors/colors" "1.5.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.12, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.2.tgz#58a82b7d81c7010da5bd4b2c0c85ac4b4ec5131e" + integrity sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.4: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +next@latest: + version "13.4.12" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.12.tgz#809b21ea0aabbe88ced53252c88c4a5bd5af95df" + integrity sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw== + dependencies: + "@next/env" "13.4.12" + "@swc/helpers" "0.5.1" + busboy "1.6.0" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.1" + watchpack "2.4.0" + zod "3.21.4" + optionalDependencies: + "@next/swc-darwin-arm64" "13.4.12" + "@next/swc-darwin-x64" "13.4.12" + "@next/swc-linux-arm64-gnu" "13.4.12" + "@next/swc-linux-arm64-musl" "13.4.12" + "@next/swc-linux-x64-gnu" "13.4.12" + "@next/swc-linux-x64-musl" "13.4.12" + "@next/swc-win32-arm64-msvc" "13.4.12" + "@next/swc-win32-ia32-msvc" "13.4.12" + "@next/swc-win32-x64-msvc" "13.4.12" + +node-cleanup@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" + integrity sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch-cjs@^3.2.10: + version "3.2.10" + resolved "https://registry.yarnpkg.com/node-fetch-cjs/-/node-fetch-cjs-3.2.10.tgz#c91e7322e031885f730a8ef6eea72babe1acd43e" + integrity sha512-YNFkGjcTGGZKvUuYyf6Kv9yQ+UOx1Ce8doWQeqleKL4EWk1s/sYu5AAXtigRlSDpLYGnr0qk1kaADJbgCEFBEw== + +node-fetch@^2.6.12: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^3.2.10: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-registry-fetch@^14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + 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" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + 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" + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +pascalcase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-1.0.0.tgz#d2fd7d73f2969606d2b56e17f5261be41c43c381" + integrity sha512-BSExi0rRnCHReJys6NocaK+cfTXNinAegfWBvr0JD3hiaEG7Nuc7r0CIdOJunXrs8gU/sbHQ9dxVAtiVQisjmg== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae" + integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^29.0.0, pretty-format@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" + integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prisma@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.0.0.tgz#f6571c46dc2478172cb7bc1bb62d74026a2c2630" + integrity sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA== + dependencies: + "@prisma/engines" "5.0.0" + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +registry-auth-token@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== + dependencies: + rc "^1.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.20.0, resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.0: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serve-handler@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.1.2" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve@^14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/serve/-/serve-14.2.0.tgz#3d768e88fa13ad8644f2393599189707176e66b8" + integrity sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg== + dependencies: + "@zeit/schemas" "2.29.0" + ajv "8.11.0" + arg "5.0.2" + boxen "7.0.0" + chalk "5.0.1" + chalk-template "0.4.0" + clipboardy "3.0.0" + compression "1.7.4" + is-port-reachable "4.0.0" + serve-handler "6.1.5" + update-check "1.5.4" + +server-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/server-only/-/server-only-0.0.1.tgz#0f366bb6afb618c37c9255a314535dc412cd1c9e" + integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-client@^4.1.2: + version "4.7.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.1.tgz#48e5f703abe4fb0402182bcf9c06b7820fb3453b" + integrity sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.1" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +supabase@^1.82.2: + version "1.82.2" + resolved "https://registry.yarnpkg.com/supabase/-/supabase-1.82.2.tgz#b96277bde42ecd760670aa9e35c8147a81d976b7" + integrity sha512-ZixBcuUP0IleNvKGXtyfM1Xyah/6koZTNn66fGAyzOFZDGhr91cgtmUn+rrLOChm0XIxNCmPi+8SzHry5zqD2w== + dependencies: + bin-links "^4.0.1" + node-fetch "^3.2.10" + tar "6.1.15" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +swr@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" + integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@6.1.15, tar@^6.1.11: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@2, through@^2.3.8, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-adt@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ts-adt/-/ts-adt-2.1.2.tgz#7a8626c2d872c97e5b38437e979b814902614fb6" + integrity sha512-UD0lr7eyiBjxogQjb1xMCjF7skrnxGZLNm4iROeU3ky5tJzXN0yQkkS4DfNGfM4RaUGMhgyrzf2wUynqK8AdWQ== + +ts-api-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.1.tgz#8144e811d44c749cd65b2da305a032510774452d" + integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A== + +ts-jest-resolver@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ts-jest-resolver/-/ts-jest-resolver-2.0.1.tgz#4a1563cb10967e17eaae04157b0ba34e24d1c247" + integrity sha512-FolE73BqVZCs8/RbLKxC67iaAtKpBWx7PeLKFW2zJQlOf9j851I7JRxSDenri2NFvVH3QP7v3S8q1AmL24Zb9Q== + dependencies: + jest-resolve "^29.5.0" + +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + 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" + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsc-watch@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.0.4.tgz#af15229f03cd53086771a97b10653db063bc6c59" + integrity sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg== + dependencies: + cross-spawn "^7.0.3" + node-cleanup "^2.1.2" + ps-tree "^1.2.0" + string-argv "^0.3.1" + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +turbo-darwin-64@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.10.12.tgz#a3d9d6bd3436e795254865bc3d76a9c79aff8085" + integrity sha512-vmDfGVPl5/aFenAbOj3eOx3ePNcWVUyZwYr7taRl0ZBbmv2TzjRiFotO4vrKCiTVnbqjQqAFQWY2ugbqCI1kOQ== + +turbo-darwin-arm64@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.12.tgz#ff1d9466935687ca68c0dee88a909c34cc654357" + integrity sha512-3JliEESLNX2s7g54SOBqqkqJ7UhcOGkS0ywMr5SNuvF6kWVTbuUq7uBU/sVbGq8RwvK1ONlhPvJne5MUqBCTCQ== + +turbo-linux-64@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.10.12.tgz#d184a491cc67c07672d339e36427378d0fc6b82e" + integrity sha512-siYhgeX0DidIfHSgCR95b8xPee9enKSOjCzx7EjTLmPqPaCiVebRYvbOIYdQWRqiaKh9yfhUtFmtMOMScUf1gg== + +turbo-linux-arm64@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.10.12.tgz#44e6ca10b20fd4c59f8c85acf8366c7c09ebca81" + integrity sha512-K/ZhvD9l4SslclaMkTiIrnfcACgos79YcAo4kwc8bnMQaKuUeRpM15sxLpZp3xDjDg8EY93vsKyjaOhdFG2UbA== + +turbo-windows-64@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.10.12.tgz#36380eca8e7b0505d08b87a084efab1500b2a80e" + integrity sha512-7FSgSwvktWDNOqV65l9AbZwcoueAILeE4L7JvjauNASAjjbuzXGCEq5uN8AQU3U5BOFj4TdXrVmO2dX+lLu8Zg== + +turbo-windows-arm64@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.10.12.tgz#757ad59b9abf1949f22280bee6e8aad253743ba5" + integrity sha512-gCNXF52dwom1HLY9ry/cneBPOKTBHhzpqhMylcyvJP0vp9zeMQQkt6yjYv+6QdnmELC92CtKNp2FsNZo+z0pyw== + +turbo@^1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.10.12.tgz#cd6f56b92da0600dae9fd94230483556a5c83187" + integrity sha512-WM3+jTfQWnB9W208pmP4oeehZcC6JQNlydb/ZHMRrhmQa+htGhWLCzd6Q9rLe0MwZLPpSPFV2/bN5egCLyoKjQ== + optionalDependencies: + turbo-darwin-64 "1.10.12" + turbo-darwin-arm64 "1.10.12" + turbo-linux-64 "1.10.12" + turbo-linux-arm64 "1.10.12" + turbo-windows-64 "1.10.12" + turbo-windows-arm64 "1.10.12" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^2.13.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + 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" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-check@1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.4.tgz#5b508e259558f1ad7dbc8b4b0457d4c9d28c8743" + integrity sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ== + dependencies: + registry-auth-token "3.3.2" + registry-url "3.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +web-streams-polyfill@^3.0.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + 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" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + 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" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +window-or-global@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/window-or-global/-/window-or-global-1.0.1.tgz#dbe45ba2a291aabc56d62cf66c45b7fa322946de" + integrity sha512-tE12J/NenOv4xdVobD+AD3fT06T4KNqnzRhkv5nBIu7K+pvOH2oLCEgYP+i+5mF2jtI6FEADheOdZkA8YWET9w== + +winston-transport@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" + integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.10.0.tgz#d033cb7bd3ced026fed13bf9d92c55b903116803" + integrity sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g== + dependencies: + "@colors/colors" "1.5.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +ws@^8.11.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.2.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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" + +yarn@^1.22.19: + version "1.22.19" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.19.tgz#4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" + integrity sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==