commit 0826d4dd890b232bb296454d6a4c0cfe8eb1b6ec Author: Warren <5959690+wrn14897@users.noreply.github.com> Date: Tue Sep 12 20:08:05 2023 -0700 first commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d45d0a7f --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +/.yarn/releases/** binary diff --git a/.github/images/architecture.png b/.github/images/architecture.png new file mode 100644 index 00000000..be1b43b6 Binary files /dev/null and b/.github/images/architecture.png differ diff --git a/.github/images/dashboard.png b/.github/images/dashboard.png new file mode 100644 index 00000000..e88f70be Binary files /dev/null and b/.github/images/dashboard.png differ diff --git a/.github/images/logo_dark.png b/.github/images/logo_dark.png new file mode 100644 index 00000000..f18c549f Binary files /dev/null and b/.github/images/logo_dark.png differ diff --git a/.github/images/logo_light.png b/.github/images/logo_light.png new file mode 100644 index 00000000..d73ab2b9 Binary files /dev/null and b/.github/images/logo_light.png differ diff --git a/.github/images/pattern3.png b/.github/images/pattern3.png new file mode 100644 index 00000000..20eef569 Binary files /dev/null and b/.github/images/pattern3.png differ diff --git a/.github/images/search_splash.png b/.github/images/search_splash.png new file mode 100644 index 00000000..e20c0145 Binary files /dev/null and b/.github/images/search_splash.png differ diff --git a/.github/images/session.png b/.github/images/session.png new file mode 100644 index 00000000..03de66e0 Binary files /dev/null and b/.github/images/session.png differ diff --git a/.github/images/trace.png b/.github/images/trace.png new file mode 100644 index 00000000..edee1431 Binary files /dev/null and b/.github/images/trace.png differ diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..ac2891e5 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,49 @@ +name: Main +on: + push: + branches: [main] + pull_request: + branches: [main] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + lint: + timeout-minutes: 8 + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + - name: Install root dependencies + uses: bahmutov/npm-install@v1 + - name: Install core libs + run: sudo apt-get install --yes curl bc + - name: Install vector + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | bash -s -- -y + ~/.vector/bin/vector --version + ln -s ~/.vector/bin/vector /usr/local/bin/vector + - name: Run lint + type check + run: yarn ci:lint + integration: + timeout-minutes: 8 + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + - name: Expose GitHub Runtime + uses: crazy-max/ghaction-github-runtime@v2 + - name: Build images + run: | + docker buildx create --use --driver=docker-container + docker buildx bake -f ./docker-compose.ci.yml --set *.cache-to="type=gha" --set *.cache-from="type=gha" --load + - name: Run integration tests + run: yarn ci:int diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..33ea49e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,56 @@ +# misc +**/.DS_Store +**/*.pem +**/keys + +# logs +**/*.log +**/npm-debug.log* +**/yarn-debug.log* +**/yarn-error.log* +**/lerna-debug.log* + +# dotenv environment variable files +**/.env +**/.env.development.local +**/.env.test.local +**/.env.production.local +**/.env.local + +# Next.js build output +packages/app/.next +packages/app/.pnp +packages/app/.pnp.js +packages/app/.vercel +packages/app/coverage +packages/app/out + +# optional npm cache directory +**/.npm + +# dependency directories +**/node_modules + +# build output +**/dist +**/build +**/tsconfig.tsbuildinfo + +# jest coverage report +**/coverage + +# e2e +e2e/cypress/screenshots/ +e2e/cypress/videos/ +e2e/cypress/results + +# scripts +scripts/*.csv +**/venv +**/__pycache__/ +*.py[cod] +*$py.class + +# docker +docker-compose.prod.yml +.volumes diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..d24fdfc6 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..e048c8ca --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18.15.0 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..6b540313 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +# Ignore artifacts: +dist +coverage +tests +.volumes diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..4cde60c9 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "fluid": false, + "arrowParens": "avoid", + "proseWrap": "always" +} diff --git a/.yarn/releases/yarn-1.22.18.cjs b/.yarn/releases/yarn-1.22.18.cjs new file mode 100755 index 00000000..7da811e1 Binary files /dev/null and b/.yarn/releases/yarn-1.22.18.cjs differ diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 00000000..58d10392 --- /dev/null +++ b/.yarnrc @@ -0,0 +1,5 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +yarn-path ".yarn/releases/yarn-1.22.18.cjs" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..359a1b7b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing + +## Architecture Overview + +![architecture](./.github/images/architecture.png) + +Service Descriptions: + +- otel: OpenTelemetry Collector, allows us to receive OpenTelemetry data from + instrumented applications and forward it to the ingestor for futher + processing. +- ingestor: Vector-based event pipeline that receives Otel and non-Otel events + and parses/normalizes/forwards it to the aggregator. +- aggregator: Node.js service that receives events from the ingestor, verifies + authentication, and inserts it to Clickhouse for storage. +- clickhouse: Clickhouse database, stores all events. +- db: MongoDB, stores user/alert/dashboard data. +- api: Node.js API, executes Clickhouse queries on behalf of the frontend. +- app: Next.js frontend, serves the UI. +- task-check-alerts: Checks for alert criteria and fires off any alerts as + needed. + +## Development + +You can get started by deploying a complete stack via Docker Compose. The core +services are all hot-reloaded, so you can make changes to the code and see them +reflected in real-time. + +If you need help getting started, +[join our Discord](https://discord.gg/FErRRKU78j) and we're more than happy to +get you set up! diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..295e7dfd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 DeploySentinel, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..717fee13 --- /dev/null +++ b/README.md @@ -0,0 +1,183 @@ +

+ hyperdx logo dark + hyperdx logo light +

+ +--- + +# HyperDX + +[HyperDX](https://hyperdx.io) helps engineers figure out why production is +broken faster by centralizing and correlating logs, metrics, traces, exceptions +and session replays in one place. An open source and developer-friendly +alternative to Datadog and New Relic. + +

+ DocumentationChat on DiscordLive Demo • Bug Reports • Contributing +

+ +- 🕵️ Correlate end to end, go from browser session replay to logs and traces in + just a few clicks +- 🔥 Blazing fast performance powered by Clickhouse +- 🔍 Intuitive full-text search and structured search syntax +- 🤖 Automatically cluster event patterns from billions of events +- 📈 Dashboard high cardinality events without learning a complex query language +- 🔔 Set up alerts in just a few clicks +- `{` Automatic JSON/structured log parsing +- 🔭 OpenTelemetry native + +
+Search logs and traces all in one place + +### Additional Screenshots + +
+ 📈 Dashboards + Dashboard +
+
+ 🤖 Automatic Event Pattern Clustering + Event Pattern Clustering +
+
+ 🖥️ Session Replay & RUM + Event Pattern Clustering +
+ +## Spinning Up HyperDX + +The HyperDX stack ingests, stores, and searches/graphs your telemetry data. +After standing up the Docker Compose stack, you'll want to instrument your app +to send data over to HyperDX. + +You can get started by deploying a complete stack via Docker Compose. After +cloning this repository, simply start the stack with: + +```bash +docker compose up +``` + +Afterwards, you can visit http://localhost:8080 to access the HyperDX UI. + +> If your server is behind a firewall, you'll need to open/forward port 8080, +> 8000 and 4318 on your firewall for the UI, API and OTel collector +> respectively. + +> We recommend at least 4GB of RAM and 2 cores for testing. + +**Enabling Self-instrumentation/Demo Logs** + +To get a quick preview of HyperDX, you can enable self-instrumentation and demo +logs by setting the `HYPERDX_API_KEY` to your ingestion key (go to +[http://localhost:8080/team](http://localhost:8080/team) after creating your +account) and then restart the stack. + +This will redirect internal telemetry from the frontend app, API, host metrics +and demo logs to your new HyperDX instance. + +ex. + +```sh +HYPERDX_API_KEY= docker compose up -d +``` + +> If you need to use `sudo` for docker, make sure to forward the environment +> variable with the `-E` flag: +> `HYPERDX_API_KEY= sudo -E docker compose up -d` + +### Hosted Cloud + +HyperDX is also available as a hosted cloud service at +[hyperdx.io](https://hyperdx.io). You can sign up for a free account and start +sending data in minutes. + +## Instrumenting Your App + +To get logs, metrics, traces, session replay, etc into HyperDX, you'll need to +instrument your app to collect and send telemetry data over to your HyperDX +instance. + +We provide a set of SDKs and integration options to make it easier to get +started with HyperDX, such as +[Browser](https://www.hyperdx.io/docs/install/browser), +[Node.js](https://www.hyperdx.io/docs/install/javascript), and +[Python](https://www.hyperdx.io/docs/install/python) + +You can find the full list in [our docs](https://www.hyperdx.io/docs). + +**OpenTelemetry** + +Additionally, HyperDX is compatible with +[OpenTelemetry](https://opentelemetry.io/), a vendor-neutral standard for +instrumenting your application backed by CNCF. Supported languages/platforms +include: + +- Kubernetes +- Javascript +- Python +- Java +- Go +- Ruby +- PHP +- .NET +- Elixir +- Rust + +(Full list [here](https://opentelemetry.io/docs/instrumentation/)) + +Once HyperDX is running, you can point your OpenTelemetry SDK to the +OpenTelemetry collector spun up at `http://localhost:4318`. + +## Contributing + +We welcome all contributions! There's many ways to contribute to the project, +including but not limited to: + +- Opening a PR (Contribution Guide) +- Submitting feature requests or bugs +- Improving our product or contribution documentation +- Voting on open issues or contributing use cases to a feature request + +## Motivation + +Our mission is to help engineers ship reliable software. To enable that, we +believe every engineer needs to be able to easily leverage productio telemetry +to quickly solve burning productio issues. + +However, in our experience, the existing tools we've used tend to fall short in +a few ways: + +1. They're expensive, and the pricing has failed to scale with TBs of telemetry + becoming the norm, leading to teams aggressively cutting the amount of data + they can collect. +2. They're hard to use, requiring full-time SREs to set up, and domain experts + to use confidently. +3. They requiring hopping from tool to tool (logs, session replay, APM, + exceptions, etc.) to stitch together the clues yourself. + +We're still early on in our journey, but are building in the open to solve these +key issues in observability. We hope you give HyperDX a try and let us know how +we're doing! + +## Open Source vs Hosted Cloud + +HyperDX is open core, with most of our features available here under an MIT +license. We have a cloud-hosted version available at +[hyperdx.io](https://hyperdx.io) with a few additional features beyond what's +offered in the open source version. + +Our cloud hosted version exists so that we can build a sustainable business and +continue building HyperDX as an open source platform. We hope to have more +comprehensive documentation on how we balance between cloud-only and open source +features in the future. In the meantime, we're highly aligned with Gitlab's +[stewardship model](https://handbook.gitlab.com/handbook/company/stewardship/). + +## Contact + +- Open an Issue +- [Discord](https://discord.gg/FErRRKU78j) +- [Email](mailto:support@hyperdx.io) + +## License + +[MIT](/LICENSE) diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml new file mode 100644 index 00000000..48c65909 --- /dev/null +++ b/docker-compose.ci.yml @@ -0,0 +1,79 @@ +version: '3.6' +services: + ch_keeper: + container_name: hdx-ci-ch-keeper + image: zookeeper:3.7 + volumes: + - ./docker/clickhouse/local/zoo.cfg:/conf/zoo.cfg + restart: on-failure + networks: + - internal + ch_server: + container_name: hdx-ci-ch-server + image: clickhouse/clickhouse-server:23.5.2-alpine + environment: + # default settings + CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 + volumes: + - ./docker/clickhouse/local/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + - ./docker/clickhouse/local/config.xml:/etc/clickhouse-server/config.xml + - ./docker/clickhouse/local/users.xml:/etc/clickhouse-server/users.xml + restart: on-failure + ports: + - 8123:8123 # http api + - 9000:9000 # native + networks: + - internal + depends_on: + - ch_keeper + db: + container_name: hdx-ci-db + image: mongo:5.0.14-focal + command: --port 29999 + ports: + - 29999:29999 + networks: + - internal + redis: + container_name: hdx-ci-redis + image: redis:7.0.11-alpine + ports: + - 6379:6379 + networks: + - internal + api: + build: + context: . + dockerfile: ./packages/api/Dockerfile + target: dev + container_name: hdx-ci-api + image: hyperdx/ci/api + ports: + - 9000:9000 + environment: + APP_TYPE: 'api' + CLICKHOUSE_HOST: http://ch_server:8123 + CLICKHOUSE_PASSWORD: api + CLICKHOUSE_USER: api + EXPRESS_SESSION_SECRET: 'hyperdx is cool 👋' + FRONTEND_URL: http://localhost:9090 # need to be localhost (CORS) + MONGO_URI: 'mongodb://db:29999/hyperdx-test' + NODE_ENV: ci + PORT: 9000 + REDIS_URL: redis://redis:6379 + SERVER_URL: http://localhost:9000 + volumes: + - ./packages/api/src:/app/src + networks: + - internal + depends_on: + - ch_server + - db + - redis + +volumes: + test_mongo_data: + +networks: + internal: + name: 'hyperdx-ci-internal-network' diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..bf15adb7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,237 @@ +version: '3' +services: + miner: + container_name: hdx-oss-dev-miner + build: + context: . + dockerfile: ./packages/miner/Dockerfile + target: dev + environment: + HYPERDX_API_KEY: ${HYPERDX_API_KEY} + HYPERDX_ENABLE_ADVANCED_NETWORK_CAPTURE: 1 + OTEL_EXPORTER_OTLP_ENDPOINT: http://otel:4318 + OTEL_LOG_LEVEL: ERROR + OTEL_SERVICE_NAME: hdx-oss-dev-miner + volumes: + - ./packages/miner/src:/app/src + ports: + - 5123:5123 + networks: + - internal + hostmetrics: + container_name: hdx-oss-dev-hostmetrics + build: + context: ./docker/hostmetrics + target: dev + volumes: + - ./docker/hostmetrics/config.dev.yaml:/etc/otelcol-contrib/config.yaml + environment: + HYPERDX_API_KEY: ${HYPERDX_API_KEY} + OTEL_SERVICE_NAME: hostmetrics + restart: always + networks: + - internal + ingestor: + container_name: hdx-oss-dev-ingestor + build: + context: ./docker/ingestor + target: dev + volumes: + - ./docker/ingestor:/app + - .volumes/ingestor_data:/var/lib/vector + ports: + - 8002:8002 # http-generic + - 8686:8686 # healthcheck + environment: + RUST_BACKTRACE: full + VECTOR_LOG: debug + VECTOR_OPENSSL_LEGACY_PROVIDER: false + restart: always + networks: + - internal + redis: + container_name: hdx-oss-dev-redis + image: redis:7.0.11-alpine + volumes: + - .volumes/redis:/data + ports: + - 6379:6379 + networks: + - internal + db: + container_name: hdx-oss-dev-db + image: mongo:5.0.14-focal + volumes: + - .volumes/db:/data/db + ports: + - 27017:27017 + networks: + - internal + otel: + container_name: hdx-oss-dev-otel + build: + context: ./docker/otel-collector + target: dev + volumes: + - ./docker/otel-collector/config.yaml:/etc/otelcol-contrib/config.yaml + ports: + - '13133:13133' # health_check extension + - '1888:1888' # pprof extension + - '24225:24225' # fluentd receiver + - '4317:4317' # OTLP gRPC receiver + - '4318:4318' # OTLP http receiver + - '55679:55679' # zpages extension + - '8888:8888' # metrics extension + - '9411:9411' # zipkin + restart: always + networks: + - internal + aggregator: + container_name: hdx-oss-dev-aggregator + build: + context: . + dockerfile: ./packages/api/Dockerfile + target: dev + image: hyperdx/dev/api + ports: + - 8001:8001 + environment: + APP_TYPE: 'aggregator' + CLICKHOUSE_HOST: http://ch-server:8123 + CLICKHOUSE_PASSWORD: aggregator + CLICKHOUSE_USER: aggregator + FRONTEND_URL: 'http://localhost:8080' # need to be localhost (CORS) + MONGO_URI: 'mongodb://db:27017/hyperdx' + NODE_ENV: development + PORT: 8001 + REDIS_URL: redis://redis:6379 + SERVER_URL: 'http://localhost:8000' + volumes: + - ./packages/api/src:/app/src + networks: + - internal + depends_on: + - db + - redis + - ch-server + task-check-alerts: + container_name: hdx-oss-dev-task-check-alerts + build: + context: . + dockerfile: ./packages/api/Dockerfile + target: dev + image: hyperdx/dev/api + entrypoint: 'yarn' + command: 'dev:task check-alerts' + environment: + APP_TYPE: 'scheduled-task' + CLICKHOUSE_HOST: http://ch-server:8123 + CLICKHOUSE_LOG_LEVEL: trace + CLICKHOUSE_PASSWORD: worker + CLICKHOUSE_USER: worker + FRONTEND_URL: 'http://localhost:8080' # need to be localhost (CORS) + HDX_NODE_ADVANCED_NETWORK_CAPTURE: 1 + HDX_NODE_BETA_MODE: 0 + HDX_NODE_CONSOLE_CAPTURE: 1 + HYPERDX_API_KEY: ${HYPERDX_API_KEY} + HYPERDX_INGESTOR_ENDPOINT: 'http://ingestor:8002' + MINER_API_URL: 'http://miner:5123' + MONGO_URI: 'mongodb://db:27017/hyperdx' + NODE_ENV: development + OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel:4318' + OTEL_SERVICE_NAME: 'hdx-oss-dev-task-check-alerts' + REDIS_URL: redis://redis:6379 + volumes: + - ./packages/api/src:/app/src + restart: always + networks: + - internal + depends_on: + - ch-server + - db + - redis + api: + container_name: hdx-oss-dev-api + build: + context: . + dockerfile: ./packages/api/Dockerfile + target: dev + image: hyperdx/dev/api + ports: + - 8000:8000 + environment: + APP_TYPE: 'api' + CLICKHOUSE_HOST: http://ch-server:8123 + CLICKHOUSE_LOG_LEVEL: trace + CLICKHOUSE_PASSWORD: api + CLICKHOUSE_USER: api + EXPRESS_SESSION_SECRET: 'hyperdx is cool 👋' + FRONTEND_URL: 'http://localhost:8080' # need to be localhost (CORS) + HDX_NODE_ADVANCED_NETWORK_CAPTURE: 1 + HDX_NODE_BETA_MODE: 1 + HDX_NODE_CONSOLE_CAPTURE: 1 + HYPERDX_API_KEY: ${HYPERDX_API_KEY} + HYPERDX_INGESTOR_ENDPOINT: 'http://ingestor:8002' + MINER_API_URL: 'http://miner:5123' + MONGO_URI: 'mongodb://db:27017/hyperdx' + NODE_ENV: development + OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel:4318' + OTEL_SERVICE_NAME: 'hdx-oss-dev-api' + PORT: 8000 + REDIS_URL: redis://redis:6379 + SERVER_URL: 'http://localhost:8000' + volumes: + - ./packages/api/src:/app/src + networks: + - internal + depends_on: + - ch-server + - db + - redis + app: + container_name: hdx-oss-dev-app + build: + context: . + dockerfile: ./packages/app/Dockerfile + target: dev + image: hyperdx/dev/app + ports: + - 8080:8080 + environment: + NEXT_PUBLIC_API_SERVER_URL: 'http://localhost:8000' # need to be localhost (CORS) + NEXT_PUBLIC_HDX_API_KEY: ${HYPERDX_API_KEY} + NEXT_PUBLIC_HDX_COLLECTOR_URL: 'http://localhost:4318' + NEXT_PUBLIC_HDX_SERVICE_NAME: 'hdx-oss-dev-app' + NODE_ENV: development + PORT: 8080 + volumes: + - ./packages/app/pages:/app/pages + - ./packages/app/public:/app/public + - ./packages/app/src:/app/src + - ./packages/app/styles:/app/styles + - ./packages/app/mdx.d.ts:/app/mdx.d.ts + - ./packages/app/next-env.d.ts:/app/next-env.d.ts + - ./packages/app/next.config.js:/app/next.config.js + networks: + - internal + depends_on: + - api + ch-server: + container_name: hdx-oss-dev-ch-server + image: clickhouse/clickhouse-server:23.7.1-alpine + ports: + - 8123:8123 # http api + - 9000:9000 # native + environment: + # default settings + CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 + volumes: + - ./docker/clickhouse/local/config.xml:/etc/clickhouse-server/config.xml + - ./docker/clickhouse/local/users.xml:/etc/clickhouse-server/users.xml + - .volumes/ch_data:/var/lib/clickhouse + - .volumes/ch_logs:/var/log/clickhouse-server + restart: on-failure + networks: + - internal +networks: + internal: diff --git a/docker/clickhouse/local/config.xml b/docker/clickhouse/local/config.xml new file mode 100644 index 00000000..37151f91 --- /dev/null +++ b/docker/clickhouse/local/config.xml @@ -0,0 +1,76 @@ + + + + debug + true + + + + + + system + query_log
+
+ + 0.0.0.0 + 8123 + 9000 + ch_server + 9009 + + 4096 + 64 + 100 + 8589934592 + 5368709120 + + /var/lib/clickhouse/ + /var/lib/clickhouse/tmp/ + /var/lib/clickhouse/user_files/ + + users.xml + default + default + UTC + false + + + + + engine MergeTree + partition by toYYYYMM(finish_date) + order by (finish_date, finish_time_us, trace_id) + + system + opentelemetry_span_log
+ 7500 +
+ + + + + + ch_server + 9000 + + + + + + + /clickhouse/task_queue/ddl + + + /var/lib/clickhouse/format_schemas/ +
diff --git a/docker/clickhouse/local/users.xml b/docker/clickhouse/local/users.xml new file mode 100644 index 00000000..3dc65a18 --- /dev/null +++ b/docker/clickhouse/local/users.xml @@ -0,0 +1,60 @@ + + + + + 10000000000 + 0 + in_order + 1 + iso + + + + + + + default + + ::/0 + + default + + + api + default + + ::/0 + + default + + + aggregator + default + + ::/0 + + default + + + worker + default + + ::/0 + + default + + + + + + + 3600 + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/docker/hostmetrics/Dockerfile b/docker/hostmetrics/Dockerfile new file mode 100644 index 00000000..bb8a0e62 --- /dev/null +++ b/docker/hostmetrics/Dockerfile @@ -0,0 +1,8 @@ +## base ############################################################################################# +FROM otel/opentelemetry-collector-contrib:0.83.0 AS base + + +## dev ############################################################################################# +FROM base as dev + +COPY ./config.dev.yaml /etc/otelcol-contrib/config.yaml diff --git a/docker/hostmetrics/config.dev.yaml b/docker/hostmetrics/config.dev.yaml new file mode 100644 index 00000000..57ca596f --- /dev/null +++ b/docker/hostmetrics/config.dev.yaml @@ -0,0 +1,37 @@ +receivers: + redis: + endpoint: redis:6379 + collection_interval: 5s + mongodb: + hosts: + - endpoint: db:27017 + collection_interval: 5s + initial_delay: 1s + tls: + insecure: true + insecure_skip_verify: true + hostmetrics: + collection_interval: 5s + scrapers: + cpu: + load: + memory: + disk: + filesystem: + network: +exporters: + logging: + loglevel: debug + otlphttp: + endpoint: 'http://otel:4318' + headers: + authorization: ${HYPERDX_API_KEY} + compression: gzip +service: + telemetry: + logs: + level: 'debug' + pipelines: + metrics: + receivers: [mongodb, redis, hostmetrics] + exporters: [otlphttp, logging] diff --git a/docker/ingestor/Dockerfile b/docker/ingestor/Dockerfile new file mode 100644 index 00000000..5165c4dc --- /dev/null +++ b/docker/ingestor/Dockerfile @@ -0,0 +1,18 @@ +## base ############################################################################################# +FROM timberio/vector:0.32.1-alpine AS base + +RUN mkdir -p /var/lib/vector +VOLUME ["/var/lib/vector"] + +WORKDIR /app + +COPY ./*.toml ./ + + +## dev ############################################################################################# +FROM base as dev + +EXPOSE 8002 8686 + +ENTRYPOINT ["vector", "-c", "http-server.core.toml", "-c", "http-server.sinks.toml", "--require-healthy", "true"] + diff --git a/docker/ingestor/http-server.core.toml b/docker/ingestor/http-server.core.toml new file mode 100644 index 00000000..c5583466 --- /dev/null +++ b/docker/ingestor/http-server.core.toml @@ -0,0 +1,753 @@ +# Set global options +data_dir = "/var/lib/vector" +acknowledgements.enabled = true + +# -------------------------------------------------------------------------------- +# ------------------------------ Sources ----------------------------------------- +# -------------------------------------------------------------------------------- +[api] + enabled = true + address = "0.0.0.0:8686" + +[sources.http_server] +type = "http_server" +address = "0.0.0.0:8002" +headers = ["authorization", "Content-Type", "Traceparent"] +strict_path = false +path = "" +query_parameters = [ + "hdx_platform", + "hdx_token", + "sentry_key", + "sentry_version" +] +# -------------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------------- +# ------------------------------ Middleware -------------------------------------- +# -------------------------------------------------------------------------------- +# WARNING: used for logs and spans only +[transforms.process_headers_n_params] +type = "remap" +inputs = ["http_server"] +source = ''' + .hdx_content_type = del(."Content-Type") + .hdx_trace_id = split(del(.Traceparent), "-")[1] ?? null + + # Hack sentry 😎 + if is_string(.sentry_key) && length(to_string(.sentry_key) ?? "") == 32 { + .hdx_content_type = "application/json" + .hdx_platform = "sentry" + .hdx_token = (slice(.sentry_key, start: 0, end: 8) + "-" + slice(.sentry_key, start: 8, end: 12) + "-" + slice(.sentry_key, start: 12, end: 16) + "-" + slice(.sentry_key, start: 16, end: 20) + "-" + slice(.sentry_key, start: 20, end: 32)) ?? null + } +''' +[transforms.unnest_jsons] +type = "remap" +inputs = ["process_headers_n_params"] +source = ''' + if !includes(["otel-metrics"], .hdx_platform) && .hdx_content_type == "application/json" { + structured, err = parse_json(.message) + if err != null { + log("Unable to parse JSON: " + err, level: "warn") + } else { + .message = structured + if is_array(.message) { + ., err = unnest(.message) + if err != null { + log("unnest failed: " + err, level: "error") + } + } + } + } +''' +[transforms.extract_token] +type = "remap" +inputs = ["unnest_jsons"] +source = ''' + if is_nullish(.hdx_token) { + if includes(["otel-traces"], .hdx_platform) { + .hdx_token = del(.message.JaegerTag.__HDX_API_KEY) + } else { + .hdx_token = split(del(.authorization), " ")[1] ?? null + if is_nullish(.hdx_token) { + .hdx_token = del(.message.__HDX_API_KEY) + } + } + # TODO: support metrics + } + + # check if token is in uuid format + if !match(to_string(.hdx_token) ?? "", r'^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$') { + log("Invalid token: " + (to_string(.hdx_token) ?? ""), level: "warn") + .hdx_token = null + } + + if !is_nullish(.hdx_token) { + .hdx_token_hash = md5(.hdx_token) + } +''' +[transforms.pre_filter] +type = "remap" +inputs = ["extract_token"] +source = ''' + hdx_message_size = strlen(encode_json(.)) + if hdx_message_size > 6000000 { + token = to_string(.hdx_token) ?? "" + log("Message size too large: " + to_string(hdx_message_size) + " bytes, token = " + token, level: "warn") + # HACK: so the downstream filter can drop it + .message = {} + .hdx_token = null + } +''' +# -------------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------------- +# ------------------------------ Logs Transform ---------------------------------- +# -------------------------------------------------------------------------------- +[transforms.filter_logs] +type = "filter" +inputs = ["pre_filter"] +condition = ''' + !includes(["otel-traces", "otel-metrics"], .hdx_platform) && !is_nullish(.hdx_token) +''' + +[transforms.logs] +type = "remap" +inputs = ["filter_logs"] +drop_on_abort = true +drop_on_error = true +reroute_dropped = true +source = ''' +.r = del(.message) +if .hdx_platform == "vector-internal" { + .ts = to_unix_timestamp(parse_timestamp(del(.timestamp), format: "%+") ?? now(), unit: "nanoseconds") + .b = . + .b.message = .r + .b._hdx_body = .r + .h = .b.host + .st = downcase(.b.metadata.level) ?? null + .sv = .hdx_platform + del(.b.r) + del(.b.hdx_platform) + del(.b.hdx_token) + .r = .b +} else if .hdx_platform == "sentry" { + .b = .r + if (to_int(.sentry_version) ?? 0) >= 7 && is_object(.b.contexts) { + .ts = (to_float(.b.timestamp) ?? 0.0) * 1000000000 + .b._hdx_body = .b.message + .h = .b.server_name + .st = downcase(.b.level) ?? "fatal" + + # extract service name + if exists(.b.contexts.hyperdx.serviceName) { + .sv = .b.contexts.hyperdx.serviceName + } else { + .sv = .b.platform + } + + # extract request metadata + if is_object(.b.request) { + .b.span.kind = "server" # only for UI + .b.http.method = upcase(.b.request.method) ?? "" + .b.http.url = .b.request.url + .b.http.request.header = .b.request.headers + del(.b.request) + } + + # extract body message + if is_nullish(.b._hdx_body) { + if is_array(.b.exception.values) { + exception_type = .b.exception.values[0].type + exception_value = .b.exception.values[0].value + if is_string(.b.transaction) { + exception_value = .b.transaction + } + .b._hdx_body = (exception_type + ": " + exception_value) ?? "" + } else { + .b._hdx_body = "" + } + } + + # user tags + if is_object(.b.user) { + .b.userEmail = del(.b.user.email) + .b.userId = del(.b.user.id) + .b.userName = del(.b.user.username) + } + + # promote span id and trace id + .b.span_id = .b.contexts.trace.span_id + .b.trace_id = .hdx_trace_id # use "Traceparent" header + if is_nullish(.b.trace_id) { + .b.trace_id = .b.contexts.trace.trace_id + } + } +} else if .hdx_content_type == "application/logplex-1" { + tmp_raw_msg = string(.r) ?? "" + tmp_attrs = parse_regex(tmp_raw_msg, r'^(\d+) <(\d+)>(\d+) (\S+) (\S+) (\S+) (\S+) - (.*)', numeric_groups: true) ?? null + if !is_object(tmp_attrs) { + log("Unable to parse logplex: '" + tmp_raw_msg + "', token: " + to_string(.hdx_token) ?? "", level: "warn") + del(.hdx_token) + del(.hdx_platform) + } else { + # convert .r into an object + .r.message = tmp_raw_msg + + tmp_priority = to_int(tmp_attrs."2") ?? null + if is_integer(tmp_priority) { + .st = to_syslog_level(mod(tmp_priority, 8) ?? 6) ?? null + } + .h = tmp_attrs."5" + .sv = (tmp_attrs."6" + "-" + tmp_attrs."7") ?? "" + tmp_body = tmp_attrs."8" + + .b = {} + .b._hdx_body = tmp_body + .ts = to_unix_timestamp(parse_timestamp(del(tmp_attrs."4"), format: "%+") ?? now(), unit: "nanoseconds") + + if contains(.sv, "heroku") { + structured = parse_key_value(tmp_body, accept_standalone_key: false) ?? null + if is_object(structured) { + .b = merge(.b, structured, deep: true) ?? .b + .h = .b.host + } + if exists(.b.at) { + .st = downcase(.b.at) ?? null + } + + # parse integer fields + tmp_int_fields = [ + "connect", + "service", + "status", + "bytes" + ] + for_each(tmp_int_fields) -> |_index, field| { + tmp_value = get(value: .b, path: [field]) ?? null + tmp_parsed_values = parse_regex(tmp_value, r'(\d+)', numeric_groups: true) ?? null + if is_object(tmp_parsed_values) { + tmp_parsed_value = to_int(tmp_parsed_values."0") ?? null + if is_integer(tmp_parsed_value) { + .b = set(value: .b, path: [field], data: tmp_parsed_value) ?? .b + } + } + } + + for_each(.b) -> |key, value| { + if starts_with(key, "sample#") { + tmp_parsed_values = parse_regex(value, r'[-+]?(?:\d*\.*\d+)', numeric_groups: true) ?? null + if is_object(tmp_parsed_values) { + tmp_parsed_value = to_float(tmp_parsed_values."0") ?? null + if is_float(tmp_parsed_value) { + .b = set(value: .b, path: [key], data: tmp_parsed_value) ?? .b + } + } + } + } + } else { + parsed = false + + # ruby logs + if !parsed { + structured = parse_regex(tmp_body, r'\[(.*) #(\d+)\]\s*(\S+) -- : (.*)', numeric_groups: true) ?? null + if is_object(structured) { + parsed = true + .b.pid = structured."2" + .b._hdx_body = structured."4" + .st = downcase(structured."3") ?? null + } + } + + # JSON + if !parsed { + structured = parse_json(tmp_body) ?? null + if is_object(structured) { + parsed = true + .b = merge(.b, structured, deep: true) ?? .b + if !is_nullish(.b.message) { + .b._hdx_body = .b.message + } + if !is_nullish(.b.level) { + .st = downcase(.b.level) ?? null + } + } + } + } + } +} else if contains(to_string(.hdx_content_type) ?? "", "text/plain", case_sensitive: false) { + .b = parse_json(.r) ?? .r + if is_object(.b) { + .r = .b + if .hdx_platform == "go" { + .b._hdx_body = .b.message + .st = downcase(.b.level) ?? null + .sv = del(.b.__hdx_sv) + .h = del(.b.__hdx_h) + .ts = to_unix_timestamp(parse_timestamp(.b.ts, format: "%+") ?? now(), unit: "nanoseconds") + } + } +} else if .hdx_content_type == "application/json" { + .b = .r + if is_object(.b) { + if .hdx_platform == "nodejs" { + tmp_hdx = del(.b.__hdx) + .r = .b + .b._hdx_body = tmp_hdx.b + .h = tmp_hdx.h + .st = downcase(tmp_hdx.st) ?? null + .sv = tmp_hdx.sv + .ts = to_unix_timestamp(parse_timestamp(tmp_hdx.ts, format: "%+") ?? now(), unit: "nanoseconds") + } else if .hdx_platform == "elixir" { + .h = del(.b.__hdx_h) + .st = downcase(.b.erl_level) ?? downcase(.b.level) ?? null + .sv = del(.b.__hdx_sv) + .ts = to_unix_timestamp(parse_timestamp(.b.timestamp, format: "%+") ?? now(), unit: "nanoseconds") + .b._hdx_body = .b.message + structured = parse_json(.b.message) ?? null + if is_object(structured) { + .b = merge(.b, structured, deep: true) ?? .b + } + } else if .hdx_platform == "flyio" { + .h = .b.host + tmp_level = downcase(.b.log.level) ?? downcase(.b.log.severity) ?? "info" + if tmp_level != "info" { + .st = tmp_level + } + .sv = .b.fly.app.name + .ts = to_unix_timestamp(parse_timestamp(.b.timestamp, format: "%+") ?? now(), unit: "nanoseconds") + .b._hdx_body = .b.message + structured = parse_json(.b.message) ?? null + if is_object(structured) { + .b = merge(.b, structured, deep: true) ?? .b + } + # TODO: maybe move this to post_logs + if !is_nullish(.b.message) { + .b._hdx_body = .b.message + } + } else if .hdx_platform == "vercel" { + .h = .b.host + .st = downcase(.b.level) ?? downcase(.b.severity) ?? null + .sv = .b.projectName + .ts = (to_int(.b.timestamp) ?? 0) * 1000000 + + # default to message + .b._hdx_body = .b.message + + # build up custom message (apache http log format) + if exists(.b.proxy) { + # set status code + tmp_status = to_int(.b.proxy.statusCode) ?? 200 + if tmp_status >= 500 { + .st = "error" + } + + .b._hdx_body = .b.proxy.clientIp + " - " + "\"" + (join([ + .b.proxy.method, + .b.proxy.path, + ], separator: " ") ?? "") + "\"" + " " + to_string(.b.proxy.statusCode) ?? "" + } + + # attach trace id + .b.trace_id = .b.requestId + + # extract more props + if .b.source == "lambda" { + .b.Duration = to_float(parse_regex(.b.message, r'Duration: (?P.*?) ms').d ?? null) ?? null + .b.BilledDuration = to_int(parse_regex(.b.message, r'Billed Duration: (?P.*?) ms').d ?? null) ?? null + .b.InitDuration = to_float(parse_regex(.b.message, r'Init Duration: (?P.*?) ms').d ?? null) ?? null + .b.MemorySize = to_int(parse_regex(.b.message, r'Memory Size: (?P.*?) MB').d ?? null) ?? null + .b.MaxMemoryUsed = to_int(parse_regex(.b.message, r'Max Memory Used: (?P.*?) MB').d ?? null) ?? null + + tmp_splits = split(.b.message, "\n") ?? [] + tmp_logs = [] + + for_each(tmp_splits) -> |_index, value| { + if !is_nullish(value) { + tmp_cur_log = {} + tmp_cur_log._hdx_body = value + + tmp_msg_splits = split(value, "\t") + for_each(tmp_msg_splits) -> |__index, tmp_msg_split| { + if starts_with(tmp_msg_split, "{") && ends_with(tmp_msg_split, "}") { + _structured = parse_json(tmp_msg_split) ?? null + if is_object(_structured) { + tmp_cur_log = merge(tmp_cur_log, _structured, deep: false) ?? tmp_cur_log + } + } + } + + tmp_logs = push(tmp_logs, tmp_cur_log) + } + } + + if length(tmp_logs) > 0 { + # will be split into multiple logs + .__hdx_logs = tmp_logs + } + } + } else if .hdx_platform == "aws-lambda" { + tmp_timestamp = to_int(.b."@timestamp") ?? 0 + .b._hdx_body = .b.message + .ts = to_unix_timestamp(from_unix_timestamp(tmp_timestamp, unit: "milliseconds") ?? now(), unit: "nanoseconds") + .sv = del(.b.type) + if is_nullish(.sv) { + .sv = .b.logGroup + } + structured = parse_json(.b.message) ?? null + if is_object(structured) { + .b = merge(.b, structured, deep: true) ?? .b + } + } else if .hdx_platform == "aws-sns" { + .st = "ok" + .b._hdx_body = .b.Message + .ts = to_unix_timestamp(parse_timestamp(.b.Timestamp, format: "%+") ?? now(), unit: "nanoseconds") + structured = parse_json(.b.Message) ?? null + if is_object(structured) { + .b = merge(.b, structured, deep: true) ?? .b + } + } else if .hdx_platform == "otel-logs" { + del(.r."@timestamp") + tmp_timestamp = del(.b."@timestamp") + + .r.timestamp = tmp_timestamp + .b.timestamp = tmp_timestamp + + .h = .b.host + .st = downcase(.b.level) ?? null + .sv = .b."service.name" + .ts = to_unix_timestamp(from_unix_timestamp(.b.timestamp, unit: "milliseconds") ?? now(), unit: "nanoseconds") + .b._hdx_body = .b.message + structured = parse_json(.b.message) ?? null + if is_object(structured) { + .b = merge(.b, structured, deep: true) ?? .b + } + + if exists(.b."rr-web.event") { + .hdx_platform = "rrweb" + temp_msg = .b.message + temp_msg_json = parse_json(temp_msg) ?? null + temp_rum_session_id = .b."rum.sessionId" + temp_rum_script_instance = .b."rum.scriptInstance" + temp_rrweb = { + "event": .b."rr-web.event", + "offset": .b."rr-web.offset", + "chunk": .b."rr-web.chunk", + "total-chunks": .b."rr-web.total-chunks" + } + .b = {} + .b._hdx_body = temp_msg + if is_object(temp_msg_json) { + .b.type = temp_msg_json.type + } + .b."rum.sessionId" = temp_rum_session_id + .b."rum.scriptInstance" = temp_rum_script_instance + .b."rr-web" = temp_rrweb + } + } + } else { + del(.b) + } +} +del(.source_type) +del(.timestamp) +del(.authorization) +del(.hdx_content_type) +del(.hdx_trace_id) +del(.sentry_key) +del(.sentry_version) +''' + +[transforms.post_logs_unnest] +type = "remap" +inputs = ["logs"] +drop_on_abort = true +drop_on_error = true +reroute_dropped = true +source = ''' +if is_array(.__hdx_logs) { + ., err = unnest(.__hdx_logs) + if err != null { + log("unnest failed: " + err, level: "error") + } +} +''' + +[transforms.post_logs] +type = "remap" +inputs = ["post_logs_unnest"] +drop_on_abort = true +drop_on_error = true +reroute_dropped = true +source = ''' +# extract shared fields +if is_object(.b) { + .s_id = string(del(.b.span_id)) ?? string(del(.b.spanID)) ?? null + .t_id = string(del(.b.trace_id)) ?? string(del(.b.traceID)) ?? null + .tso = to_unix_timestamp(now(), unit: "nanoseconds") + + if is_nullish(.st) { + .st = downcase(.b.level) ?? downcase(.b.severity) ?? downcase(.b.LEVEL) ?? downcase(.b.SEVERITY) ?? null + } + + # merge vercel logs + if is_object(.__hdx_logs) { + tmp_b_size = strlen(encode_json(.b)) + tmp_hdx_logs_size = strlen(encode_json(.__hdx_logs)) + tmp_total_size = tmp_b_size + tmp_hdx_logs_size + + # Max expanded log size 16MB + if tmp_total_size > 16000000 { + log("__hdx_logs + body size too large: " + to_string(tmp_total_size) + " bytes, token = " + to_string(.hdx_token) ?? "", level: "warn") + del(.__hdx_logs) + } else { + .b = merge(.b, del(.__hdx_logs), deep: false) ?? .b + } + + .b.message = .b._hdx_body + if is_object(.r) { + .r.message = .b._hdx_body + } + } + + # add _hdx_body to raw logs (make it searchable) + if is_object(.r) { + if !is_nullish(.b._hdx_body) && !contains(encode_json(.r), to_string(.b._hdx_body) ?? "", case_sensitive: false) { + .r._hdx_body = .b._hdx_body + } + } +} + +# validate timestamp and set it to observed timestamp if it is invalid +if exists(.ts) { + a_day_from_now = to_unix_timestamp(now(), unit: "nanoseconds") + 86400000000000 + nighty_days_ago = to_unix_timestamp(now(), unit: "nanoseconds") - 90 * 86400000000000 + if (.ts > a_day_from_now ?? false) || (.ts < nighty_days_ago ?? false) { + .ts = .tso + } +} + +# infer log level for raw logs +if is_nullish(.st) { + header = "" + if is_object(.r) && !is_nullish(.b._hdx_body) { + header = slice(to_string(.b._hdx_body) ?? "", start: 0, end: 160) ?? "" + } else { + header = slice(to_string(.r) ?? "", start: 0, end: 160) ?? "" + } + if contains(header, "info", case_sensitive: false) { + .st = "info" + } else if contains(header, "warn", case_sensitive: false) { + .st = "warn" + } else if contains(header, "error", case_sensitive: false) { + .st = "error" + } else if contains(header, "debug", case_sensitive: false) { + .st = "debug" + } else if contains(header, "trace", case_sensitive: false) { + .st = "trace" + } else if contains(header, "fatal", case_sensitive: false) { + .st = "fatal" + } else if contains(header, "notice", case_sensitive: false) { + .st = "notice" + } else if contains(header, "crit", case_sensitive: false) { + .st = "critical" + } else if contains(header, "emerg", case_sensitive: false) { + .st = "emergency" + } else if contains(header, "alert", case_sensitive: false) { + .st = "alert" + } else { + .st = "info" # mike said that on 2023-07-23 + } +} + +# TODO: compute sn ? +.sn = 0 +''' +# -------------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------------- +# ----------------------------- Spans Transform ---------------------------------- +# -------------------------------------------------------------------------------- +[transforms.filter_spans] +type = "filter" +inputs = ["pre_filter"] +condition = ''' + includes(["otel-traces"], .hdx_platform) && !is_nullish(.hdx_token) +''' + +[transforms.spans] +type = "remap" +inputs = ["filter_spans"] +drop_on_abort = true +drop_on_error = true +reroute_dropped = true +source = ''' +.r = del(.message) +if is_object(.r) { + tmp_JaegerTag = map_keys(object(.r.JaegerTag) ?? {}, recursive: true) -> |key| { replace(key,"@",".") } + tmp_process = map_keys(object(.r.process) ?? {}, recursive: true) -> |key| { replace(key,"@",".") } + tmp_timestamp = del(.r."@timestamp") + .r.timestamp = tmp_timestamp + .r.JaegerTag = tmp_JaegerTag + .r.process = tmp_process + .s_n = .r.operationName + .s_id = .r.spanID + .t_id = .r.traceID + .p_id = null + ref = .r.references[0] + if (ref != null && ref.refType == "CHILD_OF") { + .p_id = ref.spanID + } + .b = tmp_JaegerTag + .b.process = tmp_process + .b.__events = .r.logs + + if (.b."span.kind" == "server") { + if (exists(.b."http.status_code") && exists(.b."http.method") && exists(.b."http.route")) { + .b._hdx_body = join([ + to_string(.b."http.status_code") ?? "", + .b."http.method", + .b."http.route", + ], separator: " ") ?? .s_n + } + } else if (.b."span.kind" == "client") { + if (exists(.b."http.status_code") && exists(.b."http.method") && exists(.b."http.url")) { + .b._hdx_body = join([ + to_string(.b."http.status_code") ?? "", + .b."http.method", + .b."http.url", + ], separator: " ") ?? .s_n + } + } else if (.b."span.kind" == "internal") { + if .b.component == "console" { + .b._hdx_body = .b.message + .st = .b.level + } + } + + if ((to_int(.b.error) ?? 0) == 1) { + .st = "error" + if !is_nullish(.b."otel.status_description") { + .b._hdx_body = .b."otel.status_description" + } else if !is_nullish(.b."error.message") { + .b._hdx_body = .b."error.message" + } + } else if is_array(.b.__events) { + for_each(array(.b.__events) ?? []) -> |_index, value| { + if is_object(value) { + if (value.fields[0].key == "event" && value.fields[0].value == "exception") { + .st = "error" + } + } + } + } + + # set default values + if is_nullish(.st) { + .st = "ok" + } + if is_nullish(.b._hdx_body) { + .b._hdx_body = .s_n + } + + # RN instrumentation + if exists(.b."process.serviceName") { + .sv = .b."process.serviceName" + } else { + .sv = .r.process.serviceName + } + + .ts = to_unix_timestamp(from_unix_timestamp(.r.startTimeMillis, unit: "milliseconds") ?? now(), unit: "nanoseconds") + .et = .ts + .r.duration * 1000 ?? 0 + .tso = to_unix_timestamp(now(), unit: "nanoseconds") + + # TODO: move this to post_spans + # add _hdx_body to raw log + if !is_nullish(.b._hdx_body) && !contains(encode_json(.r), to_string(.b._hdx_body) ?? "", case_sensitive: false) { + .r._hdx_body = .b._hdx_body + } + + del(.source_type) + del(.timestamp) + del(.authorization) + del(.hdx_content_type) +} +''' +# -------------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------------- +# ---------------------------- Metrics Transform --------------------------------- +# -------------------------------------------------------------------------------- +[transforms.filter_metrics] +type = "filter" +inputs = ["http_server"] +condition = ''' + includes(["otel-metrics"], .hdx_platform) +''' + +[transforms.pre_metrics] +type = "remap" +inputs = ["filter_metrics"] +source = ''' + del(.path) + del(.source_type) + del(.timestamp) + del(.authorization) + del(.hdx_content_type) + tmp_msg = del(.message) + .message = split(tmp_msg, "}}") ?? [] + . = unnest(.message) +''' + +[transforms.metrics] +type = "remap" +inputs = ["pre_metrics"] +drop_on_abort = true +drop_on_error = true +reroute_dropped = true +source = ''' + tmp = (del(.message) + "}}") ?? null + structured, err = parse_json(tmp) + if err == null && structured.event == "metric" { + # TODO: do this at extract_token + .hdx_token = del(structured.fields.__HDX_API_KEY) + .dt = structured.fields.metric_type + filtered_keys = ["metric_type"] + for_each(object(structured.fields) ?? {})-> |key, value| { + if is_integer(value) || is_float(value) { + filtered_keys = push(filtered_keys, key) + .n = replace(key, "metric_name:", "") + .v = value + } + } + .tso = to_unix_timestamp(now(), unit: "nanoseconds") + .ts = to_int(structured.time * 1000000000 ?? null) ?? .tso + .b = filter(object(structured.fields) ?? {})-> |key, value| { + !includes(filtered_keys, key) + } + .b.host = structured.host + } +''' +# -------------------------------------------------------------------------------- + + +# -------------------------------------------------------------------------------- +# --------------------------------- Debug ---------------------------------------- +# -------------------------------------------------------------------------------- +[transforms.debug_dropped] +type = "remap" +inputs = [ + "logs.dropped", + "metrics.dropped", + "post_logs.dropped", + "post_logs_unnest.dropped", + "spans.dropped" +] +source = ''' + log(., level: "error") +''' +# -------------------------------------------------------------------------------- diff --git a/docker/ingestor/http-server.sinks.toml b/docker/ingestor/http-server.sinks.toml new file mode 100644 index 00000000..d9c1b5ce --- /dev/null +++ b/docker/ingestor/http-server.sinks.toml @@ -0,0 +1,21 @@ +[sinks.dev_hdx_aggregator] +type = "http" +uri = "http://aggregator:8001" +inputs = ["spans", "post_logs"] +compression = "gzip" +encoding.codec = "json" +batch.max_bytes = 10485760 # 10MB, required for rrweb payloads +batch.max_events = 100 +batch.timeout_secs = 1 + + +[sinks.dev_hdx_metrics_aggregator] +type = "http" +uri = "http://aggregator:8001?telemetry=metric" +inputs = ["metrics"] +compression = "gzip" +encoding.codec = "json" +batch.max_bytes = 100000 +batch.max_events = 100 +batch.timeout_secs = 1 +# -------------------------------------------------------------------------------- diff --git a/docker/ingestor/run_linting.sh b/docker/ingestor/run_linting.sh new file mode 100755 index 00000000..2a0ed162 --- /dev/null +++ b/docker/ingestor/run_linting.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +directory="./docker/ingestor" + +vector validate --no-environment $directory/*.toml diff --git a/docker/otel-collector/Dockerfile b/docker/otel-collector/Dockerfile new file mode 100644 index 00000000..1de2bedb --- /dev/null +++ b/docker/otel-collector/Dockerfile @@ -0,0 +1,10 @@ +## base ############################################################################################# +FROM otel/opentelemetry-collector-contrib:0.83.0 AS base + + +## dev ############################################################################################# +FROM base as dev + +COPY ./config.yaml /etc/otelcol-contrib/config.yaml + +EXPOSE 1888 4317 4318 55679 13133 diff --git a/docker/otel-collector/config.yaml b/docker/otel-collector/config.yaml new file mode 100644 index 00000000..dbadc635 --- /dev/null +++ b/docker/otel-collector/config.yaml @@ -0,0 +1,86 @@ +receivers: + # Data sources: traces + zipkin: + endpoint: '0.0.0.0:9411' + # Data sources: logs + fluentforward: + endpoint: '0.0.0.0:24225' + # Data sources: traces, metrics, logs + otlp: + protocols: + grpc: + include_metadata: true + endpoint: '0.0.0.0:4317' + http: + cors: + allowed_origins: ['*'] + allowed_headers: ['*'] + include_metadata: true + endpoint: '0.0.0.0:4318' +processors: + resourcedetection: + detectors: + - env + - system + - docker + timeout: 5s + override: false + attributes/attachHdxKey: + actions: + - key: __HDX_API_KEY + from_context: authorization + action: upsert + batch: + memory_limiter: + # 80% of maximum memory up to 2G + limit_mib: 1500 + # 25% of limit up to 2G + spike_limit_mib: 512 + check_interval: 5s +exporters: + logging: + loglevel: debug + logzio/traces: + account_token: 'X' # required but we don't use it + endpoint: 'http://ingestor:8002?hdx_platform=otel-traces' + logzio/logs: + account_token: 'X' # required but we don't use it + endpoint: 'http://ingestor:8002?hdx_platform=otel-logs' + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/splunkhecexporter + splunk_hec: + token: 'X' # required but we don't use it + # endpoint: 'http://ingestor:8002?hdx_platform=otel-metrics' + endpoint: 'http://ingestor:8002?hdx_platform=otel-metrics' + # HTTP timeout when sending data. Defaults to 10s. + timeout: 10s + max_content_length_logs: 0 +extensions: + health_check: + endpoint: :13133 + pprof: + endpoint: :1888 + zpages: + endpoint: :55679 + memory_ballast: + # Memory Ballast size should be max 1/3 to 1/2 of memory. + size_mib: 683 +service: + telemetry: + metrics: + address: ':8888' + logs: + level: 'debug' + extensions: [health_check, zpages, memory_ballast] + pipelines: + traces: + receivers: [otlp, zipkin] + processors: [attributes/attachHdxKey, memory_limiter, batch] + exporters: [logzio/traces, logging] + metrics: + receivers: [otlp] + processors: [attributes/attachHdxKey, memory_limiter, batch] + exporters: [splunk_hec, logging] + logs: + receivers: [otlp, fluentforward] + processors: [attributes/attachHdxKey, memory_limiter, batch] + exporters: [logzio/logs, logging] diff --git a/nx.json b/nx.json new file mode 100644 index 00000000..24f2f31e --- /dev/null +++ b/nx.json @@ -0,0 +1,22 @@ +{ + "affected": { + "defaultBase": "main" + }, + "workspaceLayout": { + "appsDir": "packages", + "libsDir": "packages" + }, + "targetDefaults": { + "build": { + "dependsOn": ["^build"] + } + }, + "tasksRunnerOptions": { + "default": { + "runner": "nx/tasks-runners/default", + "options": { + "cacheableOperations": ["build", "lint", "test"] + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..de1c7c57 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "private": true, + "version": "0.0.0", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "devDependencies": { + "@nx/workspace": "16.8.1", + "husky": "^8.0.3", + "lint-staged": "^13.1.2", + "nx": "16.8.1", + "prettier": "2.8.4" + }, + "scripts": { + "prepare": "husky install", + "dev:lint": "./docker/ingestor/run_linting.sh && yarn workspaces run ci:lint", + "ci:lint": "./docker/ingestor/run_linting.sh && yarn workspaces run ci:lint", + "dev:int": "docker compose -p int -f ./docker-compose.ci.yml run --rm api dev:int", + "ci:int": "docker compose -p int -f ./docker-compose.ci.yml run --rm api ci:int" + }, + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" + } +} diff --git a/packages/api/.Dockerignore b/packages/api/.Dockerignore new file mode 100644 index 00000000..ca576200 --- /dev/null +++ b/packages/api/.Dockerignore @@ -0,0 +1,2 @@ +**/node_modules +**/build \ No newline at end of file diff --git a/packages/api/.eslintignore b/packages/api/.eslintignore new file mode 100644 index 00000000..e6b6fdca --- /dev/null +++ b/packages/api/.eslintignore @@ -0,0 +1,3 @@ +keys +node_modules +archive diff --git a/packages/api/.eslintrc.js b/packages/api/.eslintrc.js new file mode 100644 index 00000000..c4a28408 --- /dev/null +++ b/packages/api/.eslintrc.js @@ -0,0 +1,24 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'prettier'], + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + rules: { + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-namespace': 'warn', + '@typescript-eslint/no-unused-vars': 'warn', + 'prettier/prettier': 'error', + }, +}; diff --git a/packages/api/Dockerfile b/packages/api/Dockerfile new file mode 100644 index 00000000..d88e4313 --- /dev/null +++ b/packages/api/Dockerfile @@ -0,0 +1,18 @@ +## base ############################################################################################# +FROM node:18.15.0-alpine AS base + +WORKDIR /app + +COPY .yarn ./.yarn +COPY .yarnrc yarn.lock ./packages/api/jest.config.js ./packages/api/tsconfig.json ./packages/api/package.json ./ +RUN yarn install --frozen-lockfile && yarn cache clean + + +## dev ############################################################################################# + +FROM base AS dev + +EXPOSE 8000 + +ENTRYPOINT ["yarn"] +CMD ["dev"] diff --git a/packages/api/jest.config.js b/packages/api/jest.config.js new file mode 100644 index 00000000..a3762cb2 --- /dev/null +++ b/packages/api/jest.config.js @@ -0,0 +1,9 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + verbose: true, + rootDir: './src', + testMatch: ['**/__tests__/*.test.ts?(x)'], + testTimeout: 30000, +}; diff --git a/packages/api/package.json b/packages/api/package.json new file mode 100644 index 00000000..895a8334 --- /dev/null +++ b/packages/api/package.json @@ -0,0 +1,91 @@ +{ + "name": "@hyperdx/api", + "version": "1.0.0", + "license": "MIT", + "private": true, + "engines": { + "node": ">=18.12.0" + }, + "dependencies": { + "@clickhouse/client": "^0.1.1", + "@hyperdx/lucene": "^3.1.1", + "@hyperdx/node-opentelemetry": "^0.2.2", + "@slack/webhook": "^6.1.0", + "compression": "^1.7.4", + "connect-mongo": "^4.6.0", + "cors": "^2.8.5", + "date-fns": "^2.28.0", + "date-fns-tz": "^2.0.0", + "express": "^4.17.3", + "express-rate-limit": "^6.7.1", + "express-session": "^1.17.3", + "express-winston": "^4.2.0", + "extract-domain": "^2.4.1", + "isemail": "^3.2.0", + "jsonwebtoken": "^9.0.0", + "lodash": "^4.17.21", + "minimist": "^1.2.7", + "mongoose": "^6.12.0", + "ms": "^2.1.3", + "node-schedule": "^2.1.1", + "object-hash": "^3.0.0", + "on-headers": "^1.0.2", + "passport": "^0.5.3", + "passport-local": "^1.0.0", + "passport-local-mongoose": "^6.1.0", + "pluralize": "^8.0.0", + "rate-limit-redis": "^3.0.2", + "redis": "^4.6.8", + "semver": "^7.5.2", + "serialize-error": "^8.1.0", + "sqlstring": "^2.3.3", + "uuid": "^8.3.2", + "winston": "^3.10.0", + "zod": "^3.22.2", + "zod-express-middleware": "^1.4.0" + }, + "devDependencies": { + "@slack/types": "^2.8.0", + "@types/airbnb__node-memwatch": "^2.0.0", + "@types/compression": "^1.7.3", + "@types/cors": "^2.8.14", + "@types/express": "^4.17.13", + "@types/express-session": "^1.17.7", + "@types/extract-domain": "^2.3.1", + "@types/hyperdx__lucene": "npm:@types/lucene", + "@types/jest": "^28.1.1", + "@types/lodash": "^4.14.198", + "@types/minimist": "^1.2.2", + "@types/ms": "^0.7.31", + "@types/object-hash": "^2.2.1", + "@types/passport-http-bearer": "^1.0.37", + "@types/passport-local": "^1.0.34", + "@types/pluralize": "^0.0.29", + "@types/semver": "^7.3.12", + "@types/sqlstring": "^2.3.0", + "@types/supertest": "^2.0.12", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "^5.46.1", + "@typescript-eslint/parser": "^5.46.1", + "eslint": "^8.48.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^28.1.1", + "nodemon": "^2.0.20", + "rimraf": "^4.4.1", + "supertest": "^6.3.1", + "ts-jest": "^28.0.5", + "ts-node": "^10.8.1", + "typescript": "^4.9.5" + }, + "scripts": { + "start": "node ./build/index.js", + "dev": "nodemon --signal SIGTERM -e ts,json --exec 'ts-node' --transpile-only -r '@hyperdx/node-opentelemetry/build/src/tracing' ./src/index.ts", + "dev:task": "ts-node -r '@hyperdx/node-opentelemetry/build/src/tracing' ./src/tasks/index.ts", + "build": "rimraf ./build && tsc", + "lint": "eslint . --ext .ts", + "ci:lint": "yarn lint && yarn tsc --noEmit", + "ci:int": "jest --runInBand --ci --forceExit --coverage", + "dev:int": "jest --watchAll --runInBand --detectOpenHandles" + } +} diff --git a/packages/api/src/aggregator-app.ts b/packages/api/src/aggregator-app.ts new file mode 100644 index 00000000..a62951a7 --- /dev/null +++ b/packages/api/src/aggregator-app.ts @@ -0,0 +1,50 @@ +import compression from 'compression'; +import express from 'express'; + +import * as clickhouse from './clickhouse'; +import logger, { expressLogger } from './utils/logger'; +import routers from './routers/aggregator'; +import { appErrorHandler } from './middleware/error'; +import { mongooseConnection } from './models'; + +import type { Request, Response, NextFunction } from 'express'; + +const app: express.Application = express(); + +const healthCheckMiddleware = async ( + req: Request, + res: Response, + next: NextFunction, +) => { + if (mongooseConnection.readyState !== 1) { + logger.error('MongoDB is down!'); + return res.status(500).send('MongoDB is down!'); + } + + try { + await clickhouse.healthCheck(); + } catch (e) { + logger.error('Clickhouse is down!'); + return res.status(500).send('Clickhouse is down!'); + } + next(); +}; + +app.disable('x-powered-by'); +app.use(compression()); +app.use(express.json({ limit: '64mb' })); +app.use(express.text({ limit: '64mb' })); +app.use(express.urlencoded({ extended: false, limit: '64mb' })); + +app.use(expressLogger); + +// --------------------------------------------------------- +// -------------------- Routers ---------------------------- +// --------------------------------------------------------- +app.use('/', healthCheckMiddleware, routers.rootRouter); +// --------------------------------------------------------- + +// error handling +app.use(appErrorHandler); + +export default app; diff --git a/packages/api/src/api-app.ts b/packages/api/src/api-app.ts new file mode 100644 index 00000000..e263f36f --- /dev/null +++ b/packages/api/src/api-app.ts @@ -0,0 +1,75 @@ +import MongoStore from 'connect-mongo'; +import compression from 'compression'; +import express from 'express'; +import session from 'express-session'; +import onHeaders from 'on-headers'; + +import * as config from './config'; +import defaultCors from './middleware/cors'; +import passport from './utils/passport'; +import routers from './routers/api'; +import { appErrorHandler } from './middleware/error'; +import { expressLogger } from './utils/logger'; + +const app: express.Application = express(); + +const sess: session.SessionOptions & { cookie: session.CookieOptions } = { + resave: false, + saveUninitialized: false, + secret: config.EXPRESS_SESSION_SECRET, + cookie: { + secure: false, + maxAge: 1000 * 60 * 60 * 24 * 30, // 30 days + }, + rolling: true, + store: new MongoStore({ mongoUrl: config.MONGO_URI }), +}; + +if (config.IS_PROD) { + app.set('trust proxy', 1); // Super important or cookies don't get set in prod + sess.cookie.secure = true; + sess.cookie.domain = config.COOKIE_DOMAIN; +} + +app.disable('x-powered-by'); +app.use(compression()); +app.use(express.json({ limit: '32mb' })); +app.use(express.text({ limit: '32mb' })); +app.use(express.urlencoded({ extended: false, limit: '32mb' })); +app.use(session(sess)); + +app.use(passport.initialize()); +app.use(passport.session()); + +app.use(expressLogger); +// Allows timing data from frontend package +// see: https://github.com/expressjs/cors/issues/102 +app.use(function (req, res, next) { + onHeaders(res, function () { + const allowOrigin = res.getHeader('Access-Control-Allow-Origin'); + if (allowOrigin) { + res.setHeader('Timing-Allow-Origin', allowOrigin); + } + }); + next(); +}); +app.use(defaultCors); + +// --------------------------------------------------------------------- +// ----------------------- Internal Routers ---------------------------- +// --------------------------------------------------------------------- +app.use('/', routers.rootRouter); +app.use('/alerts', routers.alertsRouter); +app.use('/dashboards', routers.dashboardRouter); +app.use('/log-views', routers.logViewsRouter); +app.use('/logs', routers.logsRouter); +app.use('/metrics', routers.metricsRouter); +app.use('/sessions', routers.sessionsRouter); +app.use('/team', routers.teamRouter); +app.use('/webhooks', routers.webhooksRouter); +// --------------------------------------------------------------------- + +// error handling +app.use(appErrorHandler); + +export default app; diff --git a/packages/api/src/clickhouse/__tests__/clickhouse.test.ts b/packages/api/src/clickhouse/__tests__/clickhouse.test.ts new file mode 100644 index 00000000..4b1b218b --- /dev/null +++ b/packages/api/src/clickhouse/__tests__/clickhouse.test.ts @@ -0,0 +1,45 @@ +import * as clickhouse from '..'; + +describe('clickhouse', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('clientInsertWithRetries (success)', async () => { + jest + .spyOn(clickhouse.client, 'insert') + .mockRejectedValueOnce(new Error('first error')) + .mockRejectedValueOnce(new Error('second error')) + .mockResolvedValueOnce(null as any); + + await clickhouse.clientInsertWithRetries({ + table: 'testTable', + values: [{ test: 'test' }], + retries: 3, + timeout: 100, + }); + + expect(clickhouse.client.insert).toHaveBeenCalledTimes(3); + }); + + it('clientInsertWithRetries (fail)', async () => { + jest + .spyOn(clickhouse.client, 'insert') + .mockRejectedValueOnce(new Error('first error')) + .mockRejectedValueOnce(new Error('second error')); + + try { + await clickhouse.clientInsertWithRetries({ + table: 'testTable', + values: [{ test: 'test' }], + retries: 2, + timeout: 100, + }); + } catch (error: any) { + expect(error.message).toBe('second error'); + } + + expect(clickhouse.client.insert).toHaveBeenCalledTimes(2); + expect.assertions(2); + }); +}); diff --git a/packages/api/src/clickhouse/__tests__/searchQueryParser.test.ts b/packages/api/src/clickhouse/__tests__/searchQueryParser.test.ts new file mode 100644 index 00000000..7ecba4aa --- /dev/null +++ b/packages/api/src/clickhouse/__tests__/searchQueryParser.test.ts @@ -0,0 +1,563 @@ +import SqlString from 'sqlstring'; + +import { LogsPropertyTypeMappingsModel } from '../propertyTypeMappingsModel'; +import { + SearchQueryBuilder, + genWhereSQL, + msToBigIntNs, + parse, +} from '../searchQueryParser'; + +describe('searchQueryParser', () => { + describe('helpers', () => { + it('msToBigIntNs', () => { + expect(msToBigIntNs(0)).toBe(BigInt(0)); + expect(msToBigIntNs(1000)).toBe(BigInt(1000000000)); + }); + }); + + // for implicit field + function implicitLike(column: string, term: string) { + return `(lower(${column}) LIKE lower('${term}'))`; + } + + function implicitLikeSubstring(column: string, term: string) { + return `(lower(${column}) LIKE lower('%${term}%'))`; + } + + function like(column: string, term: string) { + return `(${column} ILIKE '${term}')`; + } + function likeSubstring(column: string, term: string) { + return `(${column} ILIKE '%${term}%')`; + } + function nlike(column: string, term: string) { + return `(${column} NOT ILIKE '%${term}%')`; + } + function hasToken(column: string, term: string, noParen = false) { + return `${noParen ? '' : '('}hasTokenCaseInsensitive(${column}, '${term}')${ + noParen ? '' : ')' + }`; + } + function notHasToken(column: string, term: string) { + return `(NOT hasTokenCaseInsensitive(${column}, '${term}'))`; + } + function eq(column: string, term: string, isExpression = false) { + return `(${column} = ${isExpression ? '' : "'"}${term}${ + isExpression ? '' : "'" + })`; + } + function neq(column: string, term: string, isExpression = false) { + return `(${column} != ${isExpression ? '' : "'"}${term}${ + isExpression ? '' : "'" + })`; + } + function range(column: string, min: string, max: string) { + return `(${column} BETWEEN ${min} AND ${max})`; + } + function nrange(column: string, min: string, max: string) { + return `(${column} NOT BETWEEN ${min} AND ${max})`; + } + function buildSearchColumnName( + type: 'string' | 'number' | 'bool', + name: string, + ) { + return SqlString.format(`_${type}_attributes[?]`, [name]); + } + + const SOURCE_COL = '_source'; + + let propertyTypesMappingsModel: LogsPropertyTypeMappingsModel; + + beforeEach(() => { + propertyTypesMappingsModel = new LogsPropertyTypeMappingsModel( + 1, + 'fake team id', + () => Promise.resolve({}), + ); + jest + .spyOn(propertyTypesMappingsModel, 'get') + .mockReturnValue(undefined as any); + jest.spyOn(propertyTypesMappingsModel, 'refresh').mockResolvedValue(); + }); + + it('SearchQueryBuilder', async () => { + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + const builder = new SearchQueryBuilder( + 'level:info OR level:warn', + propertyTypesMappingsModel, + ); + builder.timestampInBetween( + new Date('2019-01-01').getTime(), + new Date('2019-01-02').getTime(), + ); + const query = await builder.build(); + expect(query).toBe( + "(_timestamp_sort_key >= 1546300800000000000 AND _timestamp_sort_key < 1546387200000000000) AND ((severity_text ILIKE '%info%') OR (severity_text ILIKE '%warn%'))", + ); + }); + + describe('bare terms', () => { + it('parses simple bare terms', async () => { + const ast = parse('foo'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(hasToken(SOURCE_COL, 'foo')); + }); + + it('parses multiple bare terms', async () => { + const ast = parse('foo bar baz999'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${hasToken(SOURCE_COL, 'foo')} AND ${hasToken( + SOURCE_COL, + 'bar', + )} AND ${hasToken(SOURCE_COL, 'baz999')}`, + ); + }); + + it('parses quoted bare terms', async () => { + const ast = parse('"foo" "bar" baz999'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${hasToken(SOURCE_COL, 'foo')} AND ${hasToken( + SOURCE_COL, + 'bar', + )} AND ${hasToken(SOURCE_COL, 'baz999')}`, + ); + }); + + it('parses quoted multi-terms', async () => { + const ast = parse('"foo bar"'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `(${hasToken(SOURCE_COL, 'foo', true)} AND ${hasToken( + SOURCE_COL, + 'bar', + true, + )} AND ${implicitLikeSubstring(SOURCE_COL, 'foo bar')})`, + ); + }); + + it('parses bare terms with symbols', async () => { + const ast = parse('scott!'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `(${hasToken(SOURCE_COL, 'scott', true)} AND ${implicitLikeSubstring( + SOURCE_COL, + 'scott!', + )})`, + ); + }); + + it('parses quoted bare terms with symbols', async () => { + const ast = parse('"scott["'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `(${hasToken(SOURCE_COL, 'scott', true)} AND ${implicitLikeSubstring( + SOURCE_COL, + 'scott[', + )})`, + ); + }); + + // TODO: Figure out symbol handling here as well... + it.skip('does not do comparison operators on quoted bare terms', async () => { + const ast = parse('""'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `(${hasToken(SOURCE_COL, '')}} AND ${likeSubstring( + SOURCE_COL, + '', + )})`, + ); + }); + + describe('parentheses', () => { + it('parses parenthesized bare terms', async () => { + const ast = parse('foo (bar baz)'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${hasToken(SOURCE_COL, 'foo')} AND (${hasToken( + SOURCE_COL, + 'bar', + )} AND ${hasToken(SOURCE_COL, 'baz')})`, + ); + }); + + it('parses parenthesized negated bare terms', async () => { + const ast = parse('foo (-bar baz)'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${hasToken(SOURCE_COL, 'foo')} AND (${notHasToken( + SOURCE_COL, + 'bar', + )} AND ${hasToken(SOURCE_COL, 'baz')})`, + ); + }); + }); + + describe('negation', () => { + it('negates bare terms', async () => { + const ast = parse('-bar'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${notHasToken(SOURCE_COL, 'bar')}`); + }); + + it('negates quoted bare terms', async () => { + const ast = parse('-"bar baz"'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `(NOT (${hasToken(SOURCE_COL, 'bar', true)} AND ${hasToken( + SOURCE_COL, + 'baz', + true, + )} AND ${implicitLikeSubstring(SOURCE_COL, 'bar baz')}))`, + ); + }); + + it('matches negated and non-negated bare terms', async () => { + const ast = parse('foo -bar baz -qux'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${hasToken(SOURCE_COL, 'foo')} AND ${notHasToken( + SOURCE_COL, + 'bar', + )} AND ${hasToken(SOURCE_COL, 'baz')} AND ${notHasToken( + SOURCE_COL, + 'qux', + )}`, + ); + }); + }); + + describe('wildcards', () => { + it('allows wildcard prefix and postfix', async () => { + const ast = parse('*foo*'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${implicitLike(SOURCE_COL, '%foo%')}`); + }); + + it('does not parse * in the middle of terms', async () => { + const ast = parse('ff*oo*'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${implicitLike(SOURCE_COL, 'ff*oo%')}`); + }); + + // TODO: Handle this + it.skip('does not parse * in quoted terms', async () => { + const ast = parse('"*foobar baz"'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${hasToken(SOURCE_COL, '*foo*bar baz')}`); + }); + }); + }); + + describe('properties', () => { + it('parses string property values', async () => { + const ast = parse('foo:bar'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(likeSubstring("_string_attributes['foo']", 'bar')); + }); + + it('parses bool property values', async () => { + const ast = parse('foo:1'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('bool'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + // "(_bool_attributes['foo'] = 1)", + `${eq(buildSearchColumnName('bool', 'foo'), '1', true)}`, + ); + }); + + it('parses numeric property values', async () => { + const ast = parse('foo:123'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('number'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${eq( + buildSearchColumnName('number', 'foo'), + "CAST('123', 'Float64')", + true, + )}`, + ); + }); + + it('parses hex property values', async () => { + const ast = parse('foo:0fa1b0ba'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(likeSubstring("_string_attributes['foo']", '0fa1b0ba')); + }); + + it('parses quoted property values', async () => { + const ast = parse('foo:"blah:foo http://website"'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(eq("_string_attributes['foo']", 'blah:foo http://website')); + }); + + it('parses bare terms combined with property values', async () => { + const ast = parse('bar foo:0f'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${hasToken(SOURCE_COL, 'bar')} AND ${likeSubstring( + "_string_attributes['foo']", + '0f', + )}`, + ); + }); + + it('parses ranges of values', async () => { + const ast = parse('foo:[400 TO 599]'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${range("_string_attributes['foo']", '400', '599')}`); + }); + + it('parses numeric properties', async () => { + const ast = parse('5:info'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${likeSubstring("_string_attributes['5']", 'info')}`); + }); + + it('translates custom column mapping', async () => { + const ast = parse('level:info'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${likeSubstring('severity_text', 'info')}`); + }); + + it('handle non-existent property', async () => { + const ast = parse('foo:bar'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual('(1 = 0)'); + }); + + describe('negation', () => { + it('negates property values', async () => { + const ast = parse('-foo:bar'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${nlike(buildSearchColumnName('string', 'foo'), 'bar')}`); + }); + + it('supports negated negative property string values', async () => { + const ast = parse('-foo:-bar'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${nlike(buildSearchColumnName('string', 'foo'), '-bar')}`); + }); + + it('supports negated negative property number values', async () => { + const ast = parse('-foo:-5'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('number'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${neq( + buildSearchColumnName('number', 'foo'), + "CAST('-5', 'Float64')", + true, + )}`, + ); + }); + + it('supports negating numeric properties', async () => { + const ast = parse('-5:info'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${nlike(buildSearchColumnName('string', '5'), 'info')}`); + }); + + it('supports negating numeric properties with negative values', async () => { + const ast = parse('-5:-150'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('number'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${neq( + buildSearchColumnName('number', '5'), + "CAST('-150', 'Float64')", + true, + )}`, + ); + }); + + it('negates ranges of values', async () => { + const ast = parse('-5:[-100 TO -500]'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual( + `${nrange(buildSearchColumnName('string', '5'), '-100', '-500')}`, + ); + }); + + it('negates quoted searches', async () => { + const ast = parse('-foo:"bar"'); + jest.spyOn(propertyTypesMappingsModel, 'get').mockReturnValue('string'); + expect( + await genWhereSQL( + ast, + propertyTypesMappingsModel, + 'TEAM_ID_UNIT_TESTS', + ), + ).toEqual(`${neq(buildSearchColumnName('string', 'foo'), 'bar')}`); + }); + }); + }); +}); diff --git a/packages/api/src/clickhouse/index.ts b/packages/api/src/clickhouse/index.ts new file mode 100644 index 00000000..28f6a44e --- /dev/null +++ b/packages/api/src/clickhouse/index.ts @@ -0,0 +1,1756 @@ +import * as fns from 'date-fns'; +import SqlString from 'sqlstring'; +import _ from 'lodash'; +import ms from 'ms'; +import opentelemetry from '@opentelemetry/api'; +import { + Logger as _CHLogger, + SettingsMap, + createClient, +} from '@clickhouse/client'; +import { + LogParams as _CHLogParams, + ErrorLogParams as _CHErrorLogParams, +} from '@clickhouse/client/dist/logger'; +import { serializeError } from 'serialize-error'; + +import * as config from '../config'; +import logger from '../utils/logger'; +import { sleep } from '../utils/common'; +import { + LogsPropertyTypeMappingsModel, + MetricsPropertyTypeMappingsModel, +} from './propertyTypeMappingsModel'; +import { + SQLSerializer, + buildSearchColumnName, + buildSearchColumnName_OLD, + buildSearchQueryWhereCondition, + isCustomColumn, + msToBigIntNs, +} from './searchQueryParser'; + +import type { ResponseJSON, ResultSet } from '@clickhouse/client'; +import type { + LogStreamModel, + MetricModel, + RrwebEventModel, +} from '../utils/logParser'; + +const tracer = opentelemetry.trace.getTracer(__filename); + +export type SortOrder = 'asc' | 'desc' | null; + +export enum AggFn { + Avg = 'avg', + Count = 'count', + CountDistinct = 'count_distinct', + Max = 'max', + Min = 'min', + P50 = 'p50', + P90 = 'p90', + P95 = 'p95', + P99 = 'p99', + Sum = 'sum', +} + +export enum Granularity { + ThirtySecond = '30 second', + OneMinute = '1 minute', + FiveMinute = '5 minute', + TenMinute = '10 minute', + FifteenMinute = '15 minute', + ThirtyMinute = '30 minute', + OneHour = '1 hour', + TwoHour = '2 hour', + SixHour = '6 hour', + TwelveHour = '12 hour', + OneDay = '1 day', + TwoDay = '2 day', + SevenDay = '7 day', + ThirtyDay = '30 day', +} + +export enum TableName { + LogStream = 'log_stream', + Metric = 'metric_stream', + Rrweb = 'rrweb', +} + +export class CHLogger implements _CHLogger { + debug({ module, message, args }: _CHLogParams): void { + logger.debug({ + type: '@clickhouse/client', + module, + message, + ...args, + }); + } + + trace({ module, message, args }: _CHLogParams) { + // TODO: trace level ?? + logger.info({ + type: '@clickhouse/client', + module, + message, + ...args, + }); + } + + info({ module, message, args }: _CHLogParams): void { + logger.info({ + type: '@clickhouse/client', + module, + message, + ...args, + }); + } + + warn({ module, message, args }: _CHLogParams): void { + logger.warn({ + type: '@clickhouse/client', + module, + message, + ...args, + }); + } + + error({ module, message, args, err }: _CHErrorLogParams): void { + logger.error({ + type: '@clickhouse/client', + module, + message, + ...args, + err, + }); + } +} + +// TODO: move this to somewhere else +export const client = createClient({ + host: config.CLICKHOUSE_HOST, + username: config.CLICKHOUSE_USER, + password: config.CLICKHOUSE_PASSWORD, + request_timeout: ms('1m'), + compression: { + request: false, + response: false, // has to be off to enable streaming + }, + keep_alive: { + enabled: true, + // should be slightly less than the `keep_alive_timeout` setting in server's `config.xml` + // default is 3s there, so 2500 milliseconds seems to be a safe client value in this scenario + // another example: if your configuration has `keep_alive_timeout` set to 60s, you could put 59_000 here + socket_ttl: 60000, + retry_on_expired_socket: true, + }, + clickhouse_settings: { + connect_timeout: ms('1m') / 1000, + max_download_threads: 32, + max_download_buffer_size: (10 * 1024 * 1024).toString(), // default + max_execution_time: ms('2m') / 1000, + }, + log: { + LoggerClass: CHLogger, + }, +}); + +export const getLogStreamTableName = ( + version: number | undefined | null, + teamId: string, +) => `default.${TableName.LogStream}`; + +export const buildTeamLogStreamWhereCondition = ( + version: number | undefined | null, + teamId: string, +) => SqlString.raw('(1 = 1)'); + +export const buildLogStreamAdditionalFilters = ( + version: number | undefined | null, + teamId: string, +) => SettingsMap.from({}); + +export const healthCheck = () => client.ping(); + +export const connect = async () => { + if (config.IS_CI) { + return; + } + // FIXME: this is a hack to avoid CI failure + logger.info('Checking connections to ClickHouse...'); + // health check + await healthCheck(); + + logger.info('Initializing ClickHouse...'); + + // ************************************* + // Create Tables + // ************************************* + // Log model (v1) + // 1. https://opentelemetry.io/docs/reference/specification/logs/data-model/ + // 2. https://www.uber.com/blog/logging/ + // 3. https://clickhouse.com/blog/storing-log-data-in-clickhouse-fluent-bit-vector-open-telemetry#architectures + await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS default.${TableName.LogStream} ( + id UUID DEFAULT generateUUIDv4(), + type Enum8('log' = 1, 'span' = 2) DEFAULT 'log', + timestamp DateTime64(9, 'UTC') CODEC(Delta(8), ZSTD(1)), + observed_timestamp DateTime64(9, 'UTC') CODEC(Delta(8), ZSTD(1)), + end_timestamp DateTime64(9, 'UTC') CODEC(Delta(8), ZSTD(1)), + trace_id String CODEC(ZSTD(1)), + span_name String CODEC(ZSTD(1)), + span_id String CODEC(ZSTD(1)), + parent_span_id String CODEC(ZSTD(1)), + severity_number UInt8 CODEC(ZSTD(1)), + severity_text String CODEC(ZSTD(1)), + "string.names" Array(String), + "string.values" Array(String), + "number.names" Array(String), + "number.values" Array(Float64), + "bool.names" Array(String), + "bool.values" Array(UInt8), + _string_attributes Map(LowCardinality(String), String) MATERIALIZED CAST((string.names, string.values), 'Map(String, String)'), + _number_attributes Map(LowCardinality(String), Float64) MATERIALIZED CAST((number.names, number.values), 'Map(String, Float64)'), + _bool_attributes Map(LowCardinality(String), UInt8) MATERIALIZED CAST((bool.names, bool.values), 'Map(String, UInt8)'), + _created_at DateTime64(9, 'UTC') DEFAULT toDateTime64(now(), 9) CODEC(Delta(8), ZSTD(1)), + _namespace LowCardinality(String) CODEC(ZSTD(1)), + _platform LowCardinality(String) CODEC(ZSTD(1)), + _host String CODEC(ZSTD(1)), + _service LowCardinality(String) CODEC(ZSTD(1)), + _source String CODEC(ZSTD(1)), + _timestamp_sort_key Int64 MATERIALIZED toUnixTimestamp64Nano(coalesce(timestamp, observed_timestamp, _created_at)), + _hdx_body String MATERIALIZED "string.values"[indexOf("string.names", '_hdx_body')], + _duration Float64 MATERIALIZED (toUnixTimestamp64Nano(end_timestamp) - toUnixTimestamp64Nano(timestamp)) / 1000000, + _user_id String MATERIALIZED "string.values"[indexOf("string.names", 'userId')], + _user_email String MATERIALIZED "string.values"[indexOf("string.names", 'userEmail')], + _user_name String MATERIALIZED "string.values"[indexOf("string.names", 'userName')], + _rum_session_id String MATERIALIZED "string.values"[indexOf("string.names", 'process.tag.rum.sessionId')], + _hyperdx_event_size UInt32 MATERIALIZED length(_source), + INDEX idx_trace_id trace_id TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_rum_session_id _rum_session_id TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_lower_source (lower(_source)) TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1, + INDEX idx_duration _duration TYPE minmax GRANULARITY 1, + INDEX idx_string_attr_key mapKeys(_string_attributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_string_attr_val mapValues(_string_attributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_number_attr_key mapKeys(_number_attributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_number_attr_val mapValues(_number_attributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_bool_attr_key mapKeys(_bool_attributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_bool_attr_val mapValues(_bool_attributes) TYPE bloom_filter(0.01) GRANULARITY 1 + ) + ENGINE = MergeTree + TTL toDateTime(_created_at) + INTERVAL 1 MONTH DELETE + ORDER BY (_timestamp_sort_key) + SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 + `, + // Recommended for cluster usage to avoid situations + // where a query processing error occurred after the response code + // and HTTP headers were sent to the client. + // See https://clickhouse.com/docs/en/interfaces/http/#response-buffering + clickhouse_settings: { + wait_end_of_query: 1, + }, + }); + + // RRWeb table: storing rrweb metadata for the player + await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS default.${TableName.Rrweb} ( + id UUID DEFAULT generateUUIDv4(), + timestamp DateTime64(9, 'UTC') CODEC(Delta(8), ZSTD(1)), + "string.names" Array(String), + "string.values" Array(String), + "number.names" Array(String), + "number.values" Array(Float64), + "bool.names" Array(String), + "bool.values" Array(UInt8), + body MATERIALIZED "string.values"[indexOf("string.names", '_hdx_body')], + session_id MATERIALIZED "string.values"[indexOf("string.names", 'rum.sessionId')], + type MATERIALIZED "number.values"[indexOf("number.names", 'type')], + _created_at DateTime64(9, 'UTC') DEFAULT toDateTime64(now(), 9) CODEC(Delta(8), ZSTD(1)), + _service LowCardinality(String) CODEC(ZSTD(1)), + _source String CODEC(ZSTD(1)), + _timestamp_sort_key Int64 MATERIALIZED toUnixTimestamp64Nano(coalesce(timestamp, _created_at)), + _hyperdx_event_size UInt32 MATERIALIZED length(_source) + ) + ENGINE = MergeTree + TTL toDateTime(_created_at) + INTERVAL 1 MONTH DELETE + ORDER BY (session_id, type, _timestamp_sort_key) + SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 + `, + // Recommended for cluster usage to avoid situations + // where a query processing error occurred after the response code + // and HTTP headers were sent to the client. + // See https://clickhouse.com/docs/en/interfaces/http/#response-buffering + clickhouse_settings: { + wait_end_of_query: 1, + }, + }); + + // Metric model + // 1. https://opentelemetry.io/docs/specs/otel/metrics/data-model/#timeseries-model + // 2. https://github.com/mindis/prom2click + // 3. https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/internal/gauge_metrics.go + await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS default.${TableName.Metric} ( + timestamp DateTime64(9, 'UTC') CODEC(Delta(8), ZSTD(1)), + name LowCardinality(String) CODEC(ZSTD(1)), + data_type LowCardinality(String) CODEC(ZSTD(1)), + value Float64 CODEC(ZSTD(1)), + flags UInt32 CODEC(ZSTD(1)), + unit String CODEC(ZSTD(1)), + _string_attributes Map(LowCardinality(String), String) CODEC(ZSTD(1)), + _created_at DateTime64(9, 'UTC') DEFAULT toDateTime64(now(), 9) CODEC(Delta(8), ZSTD(1)), + _timestamp_sort_key Int64 MATERIALIZED toUnixTimestamp64Nano(coalesce(timestamp, _created_at)), + INDEX idx_string_attr_key mapKeys(_string_attributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_string_attr_val mapValues(_string_attributes) TYPE bloom_filter(0.01) GRANULARITY 1 + ) + ENGINE = MergeTree + PARTITION BY toDate(_created_at) + TTL toDateTime(_created_at) + INTERVAL 1 MONTH DELETE + ORDER BY (name, data_type, _string_attributes, _timestamp_sort_key) + SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 + `, + // Recommended for cluster usage to avoid situations + // where a query processing error occurred after the response code + // and HTTP headers were sent to the client. + // See https://clickhouse.com/docs/en/interfaces/http/#response-buffering + clickhouse_settings: { + wait_end_of_query: 1, + }, + }); +}; + +export const clientInsertWithRetries = async ({ + table, + values, + retries = 10, + timeout = 10000, +}: { + table: string; + values: T[]; + retries?: number; + timeout?: number; +}) => { + let maxRetries = retries; + const ts = Date.now(); + while (maxRetries > 0) { + try { + await client.insert({ + table, + values, + format: 'JSONEachRow', + }); + break; + } catch (err) { + logger.error({ + message: `Failed to bulk insert. Sleeping for ${timeout} ms...`, + table, + n: values.length, + error: serializeError(err), + maxRetries, + }); + await sleep(timeout); + maxRetries--; + if (maxRetries === 0) { + // TODO: requeue the failed events + throw err; + } + logger.warn({ + message: 'Retrying bulk insert...', + table, + n: values.length, + maxRetries, + }); + } + } + logger.info({ + message: `Bulk inserted table: ${table}`, + table, + n: values.length, + took: Date.now() - ts, + }); +}; + +export const bulkInsertRrwebEvents = async (events: RrwebEventModel[]) => { + const tableName = `default.${TableName.Rrweb}`; + await clientInsertWithRetries({ + table: tableName, + values: events, + }); +}; + +export const bulkInsertTeamLogStream = async ( + version: number | undefined | null, + teamId: string, + logs: LogStreamModel[], +) => { + const tableName = getLogStreamTableName(version, teamId); + await clientInsertWithRetries({ + table: tableName, + values: logs, + }); +}; + +export const bulkInsertTeamMetricStream = async (metrics: MetricModel[]) => { + const tableName = `default.${TableName.Metric}`; + await clientInsertWithRetries({ + table: tableName, + values: metrics, + }); +}; + +// TODO: support since, until +export const fetchMetricsPropertyTypeMappings = + (intervalSecs: number) => + async (tableVersion: number | undefined, teamId: string) => { + const tableName = `default.${TableName.Metric}`; + const query = SqlString.format( + ` + SELECT groupUniqArrayArray(mapKeys(_string_attributes)) as strings + FROM ?? + WHERE fromUnixTimestamp64Nano(_timestamp_sort_key) > now() - toIntervalSecond(?) + `, + [tableName, intervalSecs], // TODO: declare as constant + ); + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + }); + const result = await rows.json>>(); + logger.info({ + message: 'fetchMetricsPropertyTypeMappings', + query, + took: Date.now() - ts, + }); + return result; + }; + +// since, until -> unix in ms +// TODO: what if since is like 0 or the difference is too big? +export const fetchLogsPropertyTypeMappings = + (since: number, until: number) => + async (tableVersion: number | undefined, teamId: string) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const query = SqlString.format( + ` + SELECT + groupUniqArrayArray(mapKeys(_string_attributes)) as strings, + groupUniqArrayArray(mapKeys(_number_attributes)) as numbers, + groupUniqArrayArray(mapKeys(_bool_attributes)) as bools + FROM ?? + WHERE ? + AND _timestamp_sort_key >= ? + AND _timestamp_sort_key <= ? + `, + [ + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + msToBigIntNs(since), + msToBigIntNs(until), + ], + ); + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json>>(); + logger.info({ + message: 'fetchLogsPropertyTypeMappings', + query, + took: Date.now() - ts, + }); + return result; + }; + +// ****************************************************** +// ****************** Helpers *************************** +// ****************************************************** +export const msRangeToHistogramInterval = (msRange: number, total: number) => { + const diffSeconds = Math.floor(msRange / 1000); + const granularitySeconds = Math.ceil(diffSeconds / total); + + if (granularitySeconds <= 1) { + return '1 second'; + } else if (granularitySeconds <= 2) { + return '2 second'; + } else if (granularitySeconds <= 5) { + return '5 second'; + } else if (granularitySeconds <= 10) { + return '10 second'; + } else if (granularitySeconds <= 20) { + return '20 second'; + } else if (granularitySeconds <= 30) { + return '30 second'; + } else if (granularitySeconds <= 60) { + return '1 minute'; + } else if (granularitySeconds <= 5 * 60) { + return '5 minute'; + } else if (granularitySeconds <= 10 * 60) { + return '10 minute'; + } else if (granularitySeconds <= 15 * 60) { + return '15 minute'; + } else if (granularitySeconds <= 30 * 60) { + return '30 minute'; + } else if (granularitySeconds <= 3600) { + return '1 hour'; + } else if (granularitySeconds <= 2 * 3600) { + return '2 hour'; + } else if (granularitySeconds <= 6 * 3600) { + return '6 hour'; + } else if (granularitySeconds <= 12 * 3600) { + return '12 hour'; + } else if (granularitySeconds <= 24 * 3600) { + return '1 day'; + } else if (granularitySeconds <= 2 * 24 * 3600) { + return '2 day'; + } else if (granularitySeconds <= 7 * 24 * 3600) { + return '7 day'; + } else if (granularitySeconds <= 30 * 24 * 3600) { + return '30 day'; + } + + return '30 day'; +}; + +export const buildLogsPropertyTypeMappingsModel = async ( + tableVersion: number | undefined, + teamId: string, + since: number, // unix in ms + until: number, // unix in ms +) => { + const model = new LogsPropertyTypeMappingsModel( + tableVersion, + teamId, + fetchLogsPropertyTypeMappings(since, until), + ); + await model.init(); + return model; +}; + +// TODO: separate by data_type ?? +export const buildMetricsPropertyTypeMappingsModel = async ( + tableVersion: number | undefined, + teamId: string, +) => { + const model = new MetricsPropertyTypeMappingsModel( + tableVersion, + teamId, + fetchMetricsPropertyTypeMappings(ms('28d') / 1000), + ); + await model.init(); + return model; +}; + +// TODO: move this to PropertyTypeMappingsModel +export const doesLogsPropertyExist = ( + property: string, + model: LogsPropertyTypeMappingsModel, +) => { + if (!property) { + return true; // in this case, we don't refresh the property type mappings + } + return isCustomColumn(property) || model.get(property); +}; + +// ****************************************************** +export const getCHServerMetrics = async () => { + const query = ` + SELECT metric, value + FROM system.metrics + `; + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + }); + const result = await rows.json< + ResponseJSON<{ metric: string; value: string }> + >(); + logger.info({ + message: 'getCHServerMetrics', + query, + took: Date.now() - ts, + }); + return result.data + .map(row => ({ + [`${row.metric}`]: parseInt(row.value), + })) + .reduce((result, obj) => { + return { ...result, ...obj }; + }, {}); +}; + +export const getMetricsTags = async (teamId: string) => { + const tableName = `default.${TableName.Metric}`; + // TODO: remove 'data_type' in the name field + const query = SqlString.format( + ` + SELECT + format('{} - {}', name, data_type) as name, + data_type, + groupUniqArray(_string_attributes) AS tags + FROM ?? + GROUP BY name, data_type + ORDER BY name + `, + [tableName], + ); + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + }); + const result = await rows.json>(); + logger.info({ + message: 'getMetricsProps', + query, + took: Date.now() - ts, + }); + return result; +}; + +export const getMetricsChart = async ({ + aggFn, + dataType, + endTime, + granularity, + groupBy, + name, + q, + startTime, + teamId, +}: { + aggFn: AggFn; + dataType: string; + endTime: number; // unix in ms, + granularity: Granularity; + groupBy?: string; + name: string; + q: string; + startTime: number; // unix in ms + teamId: string; +}) => { + const tableName = `default.${TableName.Metric}`; + const propertyTypeMappingsModel = await buildMetricsPropertyTypeMappingsModel( + undefined, // default version + teamId, + ); + const whereClause = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: q, + startTime, + }); + const selectClause = [ + SqlString.format( + 'toUnixTimestamp(toStartOfInterval(timestamp, INTERVAL ?)) AS ts_bucket', + [granularity], + ), + groupBy + ? SqlString.format(`_string_attributes[?] AS group`, [groupBy]) + : 'name AS group', + ]; + + switch (dataType) { + case 'Gauge': + selectClause.push( + aggFn === AggFn.Count + ? 'COUNT(value) as data' + : aggFn === AggFn.Sum + ? `SUM(value) as data` + : aggFn === AggFn.Avg + ? `AVG(value) as data` + : aggFn === AggFn.Max + ? `MAX(value) as data` + : aggFn === AggFn.Min + ? `MIN(value) as data` + : `quantile(${ + aggFn === AggFn.P50 + ? '0.5' + : aggFn === AggFn.P90 + ? '0.90' + : aggFn === AggFn.P95 + ? '0.95' + : '0.99' + })(value) as data`, + ); + break; + case 'Sum': + selectClause.push( + aggFn === AggFn.Count + ? 'COUNT(delta) as data' + : aggFn === AggFn.Sum + ? `SUM(delta) as data` + : aggFn === AggFn.Avg + ? `AVG(delta) as data` + : aggFn === AggFn.Max + ? `MAX(delta) as data` + : aggFn === AggFn.Min + ? `MIN(delta) as data` + : `quantile(${ + aggFn === AggFn.P50 + ? '0.5' + : aggFn === AggFn.P90 + ? '0.90' + : aggFn === AggFn.P95 + ? '0.95' + : '0.99' + })(delta) as data`, + ); + break; + default: + logger.error(`Unsupported data type: ${dataType}`); + break; + } + + // TODO: support other data types like Sum, Histogram, etc. + const query = SqlString.format( + ` + WITH metrcis AS ( + SELECT *, runningDifference(value) AS delta + FROM ( + SELECT + timestamp, + name, + value, + _string_attributes + FROM ?? + WHERE name = ? + AND data_type = ? + AND (?) + ORDER BY _timestamp_sort_key ASC + ) + ) + SELECT ? + FROM metrcis + GROUP BY group, ts_bucket + ORDER BY ts_bucket ASC + WITH FILL + FROM toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + TO toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + STEP ? + `, + [ + tableName, + name, + dataType, + SqlString.raw(whereClause), + SqlString.raw(selectClause.join(',')), + startTime / 1000, + granularity, + endTime / 1000, + granularity, + ms(granularity) / 1000, + ], + ); + + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + }); + const result = await rows.json>>(); + logger.info({ + message: 'getMetricsChart', + query, + teamId, + took: Date.now() - ts, + }); + return result; +}; + +export const getLogsChart = async ({ + aggFn, + endTime, + field, + granularity, + groupBy, + maxNumGroups, + propertyTypeMappingsModel, + q, + sortOrder, + startTime, + tableVersion, + teamId, +}: { + aggFn: AggFn; + endTime: number; // unix in ms, + field: string; + granularity: string | undefined; // can be undefined in the number chart + groupBy: string; + maxNumGroups: number; + propertyTypeMappingsModel: LogsPropertyTypeMappingsModel; + q: string; + sortOrder?: 'asc' | 'desc'; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const whereClause = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: q, + startTime, + }); + + // WARNING: selectField can be null + const selectField = buildSearchColumnName( + propertyTypeMappingsModel.get(field), + field, + ); + + const hasGroupBy = groupBy != '' && groupBy != null; + const isCountFn = aggFn === AggFn.Count; + const groupByField = + hasGroupBy && + buildSearchColumnName(propertyTypeMappingsModel.get(groupBy), groupBy); + + const serializer = new SQLSerializer(propertyTypeMappingsModel); + + const selectClause = [ + isCountFn + ? 'count() as data' + : aggFn === AggFn.Sum + ? `sum(${selectField}) as data` + : aggFn === AggFn.Avg + ? `avg(${selectField}) as data` + : aggFn === AggFn.Max + ? `max(${selectField}) as data` + : aggFn === AggFn.Min + ? `min(${selectField}) as data` + : aggFn === AggFn.CountDistinct + ? `count(distinct ${selectField}) as data` + : `quantile(${ + aggFn === AggFn.P50 + ? '0.5' + : aggFn === AggFn.P90 + ? '0.90' + : aggFn === AggFn.P95 + ? '0.95' + : '0.99' + })(${selectField}) as data`, + granularity != null + ? `toUnixTimestamp(toStartOfInterval(timestamp, INTERVAL ${granularity})) as ts_bucket` + : "'0' as ts_bucket", + groupByField ? `${groupByField} as group` : `'${aggFn}' as group`, // FIXME: should we fallback to use aggFn as group + ].join(','); + + const groupByClause = `ts_bucket ${groupByField ? `, ${groupByField}` : ''}`; + + const query = SqlString.format( + ` + WITH raw_groups AS ( + SELECT ? + FROM ?? + WHERE ? AND (?) ? ? + GROUP BY ? + ), groups AS ( + SELECT *, MAX(data) OVER (PARTITION BY group) as rank_order_by_value + FROM raw_groups + ), final AS ( + SELECT *, DENSE_RANK() OVER (ORDER BY rank_order_by_value DESC) as rank + FROM groups + ) + SELECT * + FROM final + WHERE rank <= ? + ORDER BY ts_bucket ASC + ${ + granularity != null + ? `WITH FILL + FROM toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + TO toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + STEP ?` + : '' + }${ + sortOrder === 'asc' || sortOrder === 'desc' ? `, data ${sortOrder}` : '' + } + `, + [ + SqlString.raw(selectClause), + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(whereClause), + SqlString.raw( + !isCountFn ? ` AND (${await serializer.isNotNull(field, false)})` : '', + ), + SqlString.raw( + hasGroupBy + ? ` AND (${await serializer.isNotNull(groupBy, false)})` + : '', + ), + SqlString.raw(groupByClause), + maxNumGroups, + ...(granularity != null + ? [ + startTime / 1000, + granularity, + endTime / 1000, + granularity, + ms(granularity) / 1000, + ] + : []), + ], + ); + + return await tracer.startActiveSpan('clickhouse.getLogsChart', async span => { + span.setAttribute('query', query); + try { + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json>>(); + logger.info({ + message: 'getChart', + query, + teamId, + took: Date.now() - ts, + }); + return result; + } catch (e) { + span.recordException(e as any); + throw e; + } finally { + span.end(); + } + }); +}; + +export const getChartHistogram = async ({ + bins, + endTime, + field, + q, + startTime, + tableVersion, + teamId, +}: { + bins: number; + endTime: number; // unix in ms, + field: string; + q: string; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const propertyTypeMappingsModel = await buildLogsPropertyTypeMappingsModel( + tableVersion, + teamId, + startTime, + endTime, + ); + const whereClause = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: q, + startTime, + teamId, + }); + + // TODO: hacky way to make sure the cache is update to date + if (!doesLogsPropertyExist(field, propertyTypeMappingsModel)) { + logger.warn({ + message: `getChart: Property type mappings cache is out of date (${field})`, + }); + await propertyTypeMappingsModel.refresh(); + } + + // WARNING: selectField can be null + const selectField = buildSearchColumnName( + propertyTypeMappingsModel.get(field), + field, + ); + + const serializer = new SQLSerializer(propertyTypeMappingsModel); + + const selectClause = `histogram(${bins})(${selectField}) as data`; + + const query = SqlString.format(`SELECT ? FROM ?? WHERE ? AND (?) AND (?)`, [ + SqlString.raw(selectClause), + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(whereClause), + SqlString.raw(`${await serializer.isNotNull(field, false)}`), + ]); + + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json>>(); + logger.info({ + message: 'getChartHistogram', + query, + teamId, + took: Date.now() - ts, + }); + return result; +}; + +export const getSessions = async ({ + endTime, + limit, + offset, + q, + startTime, + tableVersion, + teamId, +}: { + endTime: number; // unix in ms, + limit: number; + offset: number; + q: string; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const propertyTypeMappingsModel = await buildLogsPropertyTypeMappingsModel( + tableVersion, + teamId, + startTime, + endTime, + ); + const sessionsWhereClause = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: `rum_session_id:* AND ${q}`, + startTime, + }); + + const buildCustomColumn = (propName: string, alias: string) => + `MAX(${buildSearchColumnName('string', propName)}) as "${alias}"`; + + const columns = [ + ['userEmail', 'userEmail'], + ['userName', 'userName'], + ['teamName', 'teamName'], + ['teamId', 'teamId'], + ] + .map(props => buildCustomColumn(props[0], props[1])) + .map(column => SqlString.raw(column)); + + const query = SqlString.format( + ` + SELECT + MAX(timestamp) AS maxTimestamp, + MIN(timestamp) AS minTimestamp, + count() AS sessionCount, + countIf(?='user-interaction') AS interactionCount, + countIf(severity_text = 'error') AS errorCount, + ? AS sessionId, + ? + FROM ?? + WHERE ? AND (?) + GROUP BY sessionId + ${ + // If the user is giving us an explicit query, we don't need to filter out sessions with no interactions + // this is because the events that match the query might not be user interactions, and we'll just show 0 results otherwise. + q.length === 0 ? 'HAVING interactionCount > 0' : '' + } + ORDER BY maxTimestamp DESC + LIMIT ?, ? + `, + [ + SqlString.raw(buildSearchColumnName('string', 'component')), + SqlString.raw(buildSearchColumnName('string', 'rum_session_id')), + columns, + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(sessionsWhereClause), + offset, + limit, + ], + ); + + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json>>(); + logger.info({ + message: 'getSessions', + query, + teamId, + took: Date.now() - ts, + }); + return result; +}; + +export const getHistogram = async ( + tableVersion: number | undefined, + teamId: string, + q: string, + startTime: number, // unix in ms + endTime: number, // unix in ms, +) => { + const msRange = endTime - startTime; + const tableName = getLogStreamTableName(tableVersion, teamId); + const propertyTypeMappingsModel = await buildLogsPropertyTypeMappingsModel( + tableVersion, + teamId, + startTime, + endTime, + ); + const whereCondition = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: q, + startTime, + }); + const interval = msRangeToHistogramInterval(msRange, 120); + const query = SqlString.format( + ` + SELECT + toUnixTimestamp(toStartOfInterval(timestamp, INTERVAL ?)) as ts_bucket, + if(multiSearchAny(severity_text, ['err', 'emerg', 'alert', 'crit', 'fatal']), 'error', 'info') as severity_group, + count(*) as count + FROM ?? + WHERE ? AND (?) + GROUP BY ts_bucket, severity_group + ORDER BY ts_bucket + WITH FILL + FROM toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + TO toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + STEP ? + LIMIT 1000 + `, + [ + interval, + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(whereCondition), + startTime / 1000, + interval, + endTime / 1000, + interval, + ms(interval) / 1000, + ], + ); + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json>>(); + logger.info({ + message: 'getHistogram', + query, + teamId, + took: Date.now() - ts, + }); + return result; +}; + +export const getLogById = async ( + tableVersion: number | undefined, + teamId: string, + sortKey: string, + logId: string, +) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const query = SqlString.format( + ` + SELECT + id, + _timestamp_sort_key AS sort_key, + timestamp, + observed_timestamp, + end_timestamp, + parent_span_id, + trace_id, + span_id, + span_name, + severity_number, + severity_text, + type, + "string.names", + "string.values", + "number.names", + "number.values", + "bool.names", + "bool.values", + _source, + _service, + _host, + _platform, + _duration as duration, + _hdx_body as body + FROM ?? + WHERE ? AND _timestamp_sort_key = ? AND id = toUUID(?) + `, + [ + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + sortKey, + logId, + ], + ); + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json>>(); + logger.info({ + message: 'getLogById', + query, + teamId, + took: Date.now() - ts, + }); + return result; +}; + +export const checkAlert = async ({ + endTime, + groupBy, + q, + startTime, + tableVersion, + teamId, + windowSizeInMins, +}: { + endTime: Date; + groupBy?: string; + q: string; + startTime: Date; + tableVersion: number | undefined; + teamId: string; + windowSizeInMins: number; +}) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const startTimeMs = fns.getTime(startTime); + const endTimeMs = fns.getTime(endTime); + + const propertyTypeMappingsModel = await buildLogsPropertyTypeMappingsModel( + tableVersion, + teamId, + startTimeMs, + endTimeMs, + ); + const whereCondition = await buildSearchQueryWhereCondition({ + endTime: endTimeMs, + propertyTypeMappingsModel, + query: groupBy ? `${q} ${groupBy}:*` : q, + startTime: startTimeMs, + }); + + const interval = `${windowSizeInMins} minute`; + + // extract group-by prop type + // FIXME: what if groupBy prop does not exist? + let groupByPropType; + if (groupBy) { + const serializer = new SQLSerializer(propertyTypeMappingsModel); + const { found, propertyType } = await serializer.getColumnForField(groupBy); + if (!found) { + throw new Error(`groupBy prop ${groupBy} does not exist`); + } + groupByPropType = propertyType; + } + + const query = SqlString.format( + ` + SELECT + ? + count(*) as count, + toStartOfInterval(timestamp, INTERVAL ?) as ts_bucket + FROM ?? + WHERE ? AND (?) + GROUP BY ? + ORDER BY ts_bucket + WITH FILL + FROM toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + TO toUnixTimestamp(toStartOfInterval(toDateTime(?), INTERVAL ?)) + STEP ? + `, + [ + SqlString.raw( + groupBy + ? `${buildSearchColumnName(groupByPropType, groupBy)} as group,` + : '', + ), + interval, + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(whereCondition), + SqlString.raw( + groupBy + ? `${buildSearchColumnName(groupByPropType, groupBy)}, ts_bucket` + : 'ts_bucket', + ), + startTimeMs / 1000, + interval, + endTimeMs / 1000, + interval, + ms(interval) / 1000, + ], + ); + + const ts = Date.now(); + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + const result = await rows.json< + ResponseJSON<{ count: string; group?: string; ts_bucket: string }> + >(); + logger.info({ + message: 'checkAlert', + query, + teamId, + took: Date.now() - ts, + }); + return result; +}; + +export type LogSearchRow = { + timestamp: string; + severity_text: string; + body: string; + _host: string; + _source: string; +}; + +const buildLogQuery = async ({ + defaultFields = [ + 'id', + 'timestamp', + 'severity_text', + '_timestamp_sort_key AS sort_key', + 'type', + '_hdx_body as body', + '_duration as duration', + '_service', + '_host', + '_platform', + ], + endTime, + extraFields = [], + limit, + offset, + order, + q, + startTime, + tableVersion, + teamId, +}: { + defaultFields?: string[]; + endTime: number; // unix in ms + extraFields?: string[]; + limit: number; + offset: number; + order: SortOrder; + q: string; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + // Validate order + if (!['asc', 'desc', null].includes(order)) { + throw new Error(`Invalid order: ${order}`); + } + + const tableName = getLogStreamTableName(tableVersion, teamId); + const propertyTypeMappingsModel = await buildLogsPropertyTypeMappingsModel( + tableVersion, + teamId, + startTime, + endTime, + ); + + const whereCondition = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: q, + startTime, + teamId, + }); + + const extraColumns = extraFields + .map(field => { + const fieldType = propertyTypeMappingsModel.get(field); + const column = buildSearchColumnName(fieldType, field); + // FIXME: sql injection ?? + return column ? `${column} as "${field}"` : null; + }) + .filter(f => f); + + const columns = _.map([...defaultFields, ...extraColumns], SqlString.raw); + const query = SqlString.format( + ` + SELECT ? + FROM ?? + WHERE ? AND (?) + ? + LIMIT ?, ? + `, + [ + columns, + tableName, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(whereCondition), + SqlString.raw( + order !== null ? `ORDER BY _timestamp_sort_key ${order}` : '', + ), + offset, + limit, + ], + ); + + return query; +}; + +export const getLogBatchGroupedByBody = async ({ + bodyMaxLength, + endTime, + interval, + limit, + q, + sampleRate, + startTime, + tableVersion, + teamId, +}: { + bodyMaxLength: number; + endTime: number; // unix in ms + interval: ReturnType; + limit: number; + q: string; + sampleRate?: number; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + const tableName = getLogStreamTableName(tableVersion, teamId); + const propertyTypeMappingsModel = await buildLogsPropertyTypeMappingsModel( + tableVersion, + teamId, + startTime, + endTime, + ); + + const whereCondition = await buildSearchQueryWhereCondition({ + endTime, + propertyTypeMappingsModel, + query: q, + startTime, + }); + + const query = SqlString.format( + ` + SELECT + COUNT(*) as lines_count, + groupArray(toStartOfInterval(timestamp, INTERVAL ?)) as buckets, + groupArray(fromUnixTimestamp64Nano(_timestamp_sort_key)) as timestamps, + groupArray(id) as ids, + groupArray(_timestamp_sort_key) AS sort_keys, + severity_text as level, + _service as service, + substring(_hdx_body, 1, ?) as body + FROM ?? + WHERE randUniform(0, 1) <= ? + AND (?) + AND (?) + GROUP BY level, service, body + ORDER BY lines_count DESC + LIMIT ? + `, + [ + interval, + bodyMaxLength, + tableName, + sampleRate ?? 1, + buildTeamLogStreamWhereCondition(tableVersion, teamId), + SqlString.raw(whereCondition), + limit, + ], + ); + + type Response = ResponseJSON<{ + body: string; + buckets: string[]; + ids: string[]; + sort_keys: string[]; + level: string; + lines_count: string; + service: string; + timestamps: string[]; + }>; + + let result: Response; + + await tracer.startActiveSpan( + 'clickhouse.getLogBatchGroupedByBody', + async span => { + span.setAttribute('query', query); + + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + result = await rows.json(); + span.setAttribute('results', result.data.length); + span.end(); + }, + ); + + return result; +}; + +export const getLogBatch = async ({ + endTime, + extraFields = [], + limit, + offset, + order, + q, + startTime, + tableVersion, + teamId, +}: { + endTime: number; // unix in ms + extraFields?: string[]; + limit: number; + offset: number; + order: SortOrder; + q: string; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + const query = await buildLogQuery({ + endTime, + extraFields, + limit, + offset, + order, + q, + startTime, + tableVersion, + teamId, + }); + + let result: ResponseJSON<{ + id: string; + timestamp: string; + severity_text: string; + body: string; + _host: string; + _source: string; + }>; + await tracer.startActiveSpan('clickhouse.getLogBatch', async span => { + span.setAttribute('query', query); + + const rows = await client.query({ + query, + format: 'JSON', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + }, + }); + result = await rows.json< + ResponseJSON<{ + id: string; + timestamp: string; + severity_text: string; + body: string; + _host: string; + _source: string; + }> + >(); + span.setAttribute('results', result.data.length); + span.end(); + }); + + return result; +}; + +export const getRrwebEvents = async ({ + sessionId, + startTime, + endTime, + limit, + offset, +}: { + sessionId: string; + startTime: number; // unix in ms + endTime: number; // unix in ms + limit: number; + offset: number; +}) => { + const columns = [ + 'body AS b', + 'type AS t', + `${buildSearchColumnName_OLD('number', 'rr-web.chunk')} as ck`, + `${buildSearchColumnName_OLD('number', 'rr-web.total-chunks')} as tcks`, + ].map(SqlString.raw); + + const query = SqlString.format( + ` + SELECT ? + FROM default.rrweb + WHERE session_id = ? + AND _timestamp_sort_key >= ? + AND _timestamp_sort_key < ? + ORDER BY _timestamp_sort_key, ck ASC + LIMIT ?, ? + `, + [ + columns, + sessionId, + msToBigIntNs(startTime), + msToBigIntNs(endTime), + offset, + limit, + ], + ); + + let resultSet: ResultSet; + await tracer.startActiveSpan('clickhouse.getRrwebEvents', async span => { + span.setAttribute('query', query); + + resultSet = await client.query({ + query, + format: 'JSONEachRow', + clickhouse_settings: { + wait_end_of_query: 0, + send_progress_in_http_headers: 0, + } as any, + }); + span.end(); + }); + + return resultSet.stream(); +}; + +export const getLogStream = async ({ + endTime, + extraFields = [], + limit, + offset, + order, + q, + startTime, + tableVersion, + teamId, +}: { + endTime: number; // unix in ms + extraFields?: string[]; + limit: number; + offset: number; + order: SortOrder; + q: string; + startTime: number; // unix in ms + tableVersion: number | undefined; + teamId: string; +}) => { + const query = await buildLogQuery({ + endTime, + extraFields, + limit, + offset, + order, + q, + startTime, + tableVersion, + teamId, + }); + + logger.info({ + message: 'generated getLogStream Query', + teamId, + query, + limit, + }); + + let resultSet: ResultSet; + await tracer.startActiveSpan('clickhouse.getLogStream', async span => { + span.setAttribute('query', query); + span.setAttribute('search', q); + span.setAttribute('teamId', teamId); + try { + resultSet = await client.query({ + query, + format: 'JSONEachRow', + clickhouse_settings: { + additional_table_filters: buildLogStreamAdditionalFilters( + tableVersion, + teamId, + ), + send_progress_in_http_headers: 0, + wait_end_of_query: 0, + }, + }); + } catch (e: any) { + span.recordException(e); + + throw e; + } finally { + span.end(); + } + }); + + return resultSet.stream(); +}; diff --git a/packages/api/src/clickhouse/propertyTypeMappingsModel.ts b/packages/api/src/clickhouse/propertyTypeMappingsModel.ts new file mode 100644 index 00000000..55dcc44c --- /dev/null +++ b/packages/api/src/clickhouse/propertyTypeMappingsModel.ts @@ -0,0 +1,195 @@ +import ms from 'ms'; +import { serializeError } from 'serialize-error'; + +import logger from '../utils/logger'; +import redisClient from '../utils/redis'; +import { IS_DEV } from '../config'; + +import type { ResponseJSON } from '@clickhouse/client'; + +const stringifyMap = (map: Map) => { + return JSON.stringify(Array.from(map.entries())); +}; + +const parseStringifiedMap = (stringifiedMap: string): Map => { + return new Map(JSON.parse(stringifiedMap)); +}; + +export abstract class PropertyTypeMappingsModel { + abstract getCacheKey(): string; + + abstract ttl(): number; + + protected readonly tableVersion: number | undefined; + + protected readonly teamId: string; + + private readonly fetchPropertyTypeMappings: ( + tableVersion: number | undefined, + teamId: string, + ) => Promise>>; + + // hold the mapping state + public currentPropertyTypeMappings: Map; + + constructor( + tableVersion: number | undefined, + teamId: string, + fetchPropertyTypeMappings: ( + tableVersion: number | undefined, + teamId: string, + ) => Promise, + ) { + this.tableVersion = tableVersion; + this.teamId = teamId; + this.fetchPropertyTypeMappings = fetchPropertyTypeMappings; + this.currentPropertyTypeMappings = new Map(); + } + + private bundlePropertyTypeMappings( + raw: ResponseJSON> | null, + ) { + const mapping = new Map(); + if (raw?.rows === 1) { + const data = raw.data[0]; + data.strings?.map((property: string) => mapping.set(property, 'string')); + data.numbers?.map((property: string) => mapping.set(property, 'number')); + data.bools?.map((property: string) => mapping.set(property, 'bool')); + } + return mapping; + } + + // decide if the cache is still valid + private async needsRefresh() { + return true; + } + + // only used internally + async _refresh({ incrementalUpdate }: { incrementalUpdate: boolean }) { + logger.info({ + message: 'propertyTypeMappingsModel _refresh start', + teamId: this.teamId, + }); + try { + const mappings = await this.fetchPropertyTypeMappings( + this.tableVersion, + this.teamId, + ); + const oldMappings = this.currentPropertyTypeMappings; + const newMappings = this.bundlePropertyTypeMappings(mappings); + this.currentPropertyTypeMappings = incrementalUpdate + ? new Map([...oldMappings, ...newMappings]) // WARNING: newMappings will overwrite oldMappings + : newMappings; + + if (incrementalUpdate) { + // if incrementalUpdate = true, we only update the value but keep the TTL + await redisClient.set( + this.getCacheKey(), + stringifyMap(this.currentPropertyTypeMappings), + { + KEEPTTL: true, + }, + ); + } else { + await redisClient.set( + this.getCacheKey(), + stringifyMap(this.currentPropertyTypeMappings), + { + PX: this.ttl(), + }, + ); + } + + logger.info({ + incrementalUpdate, + message: 'propertyTypeMappingsModel _refresh success', + teamId: this.teamId, + }); + } catch (err) { + logger.error({ + error: serializeError(err), + incrementalUpdate, + message: 'propertyTypeMappingsModel _refresh error', + teamId: this.teamId, + }); + } + } + + _debug() { + console.log([...this.currentPropertyTypeMappings.entries()]); + } + + async init() { + const cachedMappings: any = await redisClient.get(this.getCacheKey()); + if (cachedMappings) { + logger.info({ + message: 'propertyTypeMappingsModel init: cache hit', + teamId: this.teamId, + }); + this.currentPropertyTypeMappings = parseStringifiedMap(cachedMappings); + } else { + logger.info({ + message: 'propertyTypeMappingsModel init: cache miss', + teamId: this.teamId, + }); + // cache miss + await this._refresh({ incrementalUpdate: false }); + } + } + + // used by the APIs + async refresh() { + logger.info({ + message: 'propertyTypeMappingsModel refresh: start', + teamId: this.teamId, + }); + if (await this.needsRefresh()) { + logger.info({ + message: 'propertyTypeMappingsModel refresh: cache miss', + teamId: this.teamId, + }); + await this._refresh({ incrementalUpdate: true }); + } else { + logger.info({ + message: 'propertyTypeMappingsModel refresh: cache hit', + teamId: this.teamId, + }); + } + } + + get(property: string) { + return this.currentPropertyTypeMappings.get(property); + } + + size() { + return this.currentPropertyTypeMappings.size; + } + + remainingTTL() { + return redisClient.pTTL(this.getCacheKey()); + } + + async isAboutToExpire() { + return (await this.remainingTTL()) < ms('2h'); + } +} + +export class LogsPropertyTypeMappingsModel extends PropertyTypeMappingsModel { + getCacheKey() { + return `logs_property_type_mappings:${this.teamId}`; + } + + ttl() { + return IS_DEV ? ms('5s') : ms('1d'); + } +} + +export class MetricsPropertyTypeMappingsModel extends PropertyTypeMappingsModel { + getCacheKey() { + return `metrics_property_type_mappings:${this.teamId}`; + } + + ttl() { + return IS_DEV ? ms('5s') : ms('1d'); + } +} diff --git a/packages/api/src/clickhouse/searchQueryParser.ts b/packages/api/src/clickhouse/searchQueryParser.ts new file mode 100644 index 00000000..43479568 --- /dev/null +++ b/packages/api/src/clickhouse/searchQueryParser.ts @@ -0,0 +1,627 @@ +import SqlString from 'sqlstring'; +import lucene from '@hyperdx/lucene'; +import { serializeError } from 'serialize-error'; + +import { LogPlatform, LogType } from '../utils/logParser'; +import { PropertyTypeMappingsModel } from './propertyTypeMappingsModel'; + +function encodeSpecialTokens(query: string): string { + return query + .replace('http://', 'http_COLON_//') + .replace('https://', 'https_COLON_//') + .replace(/localhost:(\d{1,5})/, 'localhost_COLON_$1') + .replace(/\\:/g, 'HDX_COLON'); +} +function decodeSpecialTokens(query: string): string { + return query + .replace('http_COLON_//', 'http://') + .replace('https_COLON_//', 'https://') + .replace(/localhost_COLON_(\d{1,5})/, 'localhost:$1') + .replace(/HDX_COLON/g, ':'); +} + +export function parse(query: string): lucene.AST { + return lucene.parse(encodeSpecialTokens(query)); +} + +const IMPLICIT_FIELD = ''; + +export const msToBigIntNs = (ms: number) => BigInt(ms * 1000000); +export const isLikelyTokenTerm = (term: string) => { + return term.length >= 16; +}; + +const customColumnMap: { [level: string]: string } = { + [IMPLICIT_FIELD]: '_source', + body: '_hdx_body', + duration: '_duration', + end_timestamp: 'end_timestamp', + host: '_host', + hyperdx_event_size: '_hyperdx_event_size', + hyperdx_platform: '_platform', + level: 'severity_text', + parent_span_id: 'parent_span_id', + rum_session_id: '_rum_session_id', + service: '_service', + span_id: 'span_id', + span_name: 'span_name', + timestamp: 'timestamp', + trace_id: 'trace_id', + userEmail: '_user_email', + userId: '_user_id', + userName: '_user_name', +}; +export const customColumnMapType: { + [property: string]: 'string' | 'number' | 'bool'; +} = { + [IMPLICIT_FIELD]: 'string', + body: 'string', + duration: 'number', + host: 'string', + hyperdx_event_size: 'number', + hyperdx_platform: 'string', + level: 'string', + parent_span_id: 'string', + rum_session_id: 'string', + service: 'string', + span_id: 'string', + span_name: 'string', + trace_id: 'string', + userEmail: 'string', + userId: 'string', + userName: 'string', +}; + +export const isCustomColumn = (name: string) => customColumnMap[name] != null; + +// used by rrweb table +export const buildSearchColumnName_OLD = ( + type: 'string' | 'number' | 'bool', + name: string, +) => { + if (customColumnMap[name] != null) { + return customColumnMap[name]; + } + + return type != null && name != null + ? `"${type}.values"[indexOf("${type}.names", ${SqlString.escape(name)})]` + : null; +}; + +export const buildSearchColumnName = ( + type: 'string' | 'number' | 'bool' | undefined | null, + name: string, +) => { + if (customColumnMap[name] != null) { + return customColumnMap[name]; + } + + if (name != null && type != null) { + return SqlString.format(`_${type}_attributes[?]`, [name]); + } + + return null; +}; + +interface Serializer { + eq(field: string, term: string, isNegatedField: boolean): Promise; + isNotNull(field: string, isNegatedField: boolean): Promise; + gte(field: string, term: string): Promise; + lte(field: string, term: string): Promise; + lt(field: string, term: string): Promise; + gt(field: string, term: string): Promise; + fieldSearch( + field: string, + term: string, + isNegatedField: boolean, + prefixWildcard: boolean, + suffixWildcard: boolean, + ): Promise; + range( + field: string, + start: string, + end: string, + isNegatedField: boolean, + ): Promise; +} + +type SQLSerializerOptions = { + useTokenization: boolean; +}; +export class SQLSerializer implements Serializer { + private NOT_FOUND_QUERY = '(1 = 0)'; + + private alreadyRefrehPropertyTypeMapModel = false; + + propertyTypeMapModel: PropertyTypeMappingsModel; + + options: SQLSerializerOptions | undefined; + + constructor( + propertyTypeMappingsModel: PropertyTypeMappingsModel, + opts?: SQLSerializerOptions, + ) { + this.propertyTypeMapModel = propertyTypeMappingsModel; + this.options = opts ?? { + useTokenization: false, + }; + } + + private getCustomFieldOnly(field: string) { + return { + column: customColumnMap[field], + propertyType: customColumnMapType[field], + found: customColumnMap[field] != null, // propertyType can be null + }; + } + + // In the future this may trigger network calls against a property mapping cache + async getColumnForField(field: string) { + const customField = this.getCustomFieldOnly(field); + if (customField.found) { + return customField; + } + + let propertyType = this.propertyTypeMapModel.get(field); + // TODO: Deal with ambiguous fields + let column: string = field; + // refresh cache if property not found + if (propertyType == null && !this.alreadyRefrehPropertyTypeMapModel) { + this.alreadyRefrehPropertyTypeMapModel = true; + // TODO: what if the property type doesn't exist? + // we need to setup a cap on how many times we refresh the cache + await this.propertyTypeMapModel.refresh(); + propertyType = this.propertyTypeMapModel.get(field); + } + + if (propertyType != null) { + column = buildSearchColumnName(propertyType, field); + } + + return { + column, + propertyType, + found: column != null && propertyType != null, + }; + } + + async eq(field: string, term: string, isNegatedField: boolean) { + const { column, found, propertyType } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + if (propertyType === 'bool') { + // numeric and boolean fields must be equality matched + return SqlString.format(`(${column} ${isNegatedField ? '!' : ''}= ?)`, [ + parseInt(term), + ]); + } else if (propertyType === 'number') { + return SqlString.format( + `(${column} ${isNegatedField ? '!' : ''}= CAST(?, 'Float64'))`, + [term], + ); + } + return SqlString.format(`(${column} ${isNegatedField ? '!' : ''}= ?)`, [ + term, + ]); + } + + async isNotNull(field: string, isNegatedField: boolean) { + const customField = this.getCustomFieldOnly(field); + if (customField.found) { + if (field === 'duration') { + // Duration will be negative if there is no end_timestamp + return `_duration ${isNegatedField ? '<' : '>='} 0`; + } + if (customField.propertyType === 'string') { + // Internal string fields are not nullable as long as they are not empty, they're likely not null + return `notEmpty(${customField.column}) ${ + isNegatedField ? '!' : '' + }= 1`; + } else { + // We'll just try to check for nulls... + return `${customField.column} IS ${isNegatedField ? '' : 'NOT '}NULL`; + } + } + + const { propertyType, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + return SqlString.format(`mapContains(_${propertyType}_attributes, ?) = ?`, [ + field, + isNegatedField ? 0 : 1, + ]); + } + + async gte(field: string, term: string) { + const { column, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + return SqlString.format(`(${column} >= ?)`, [term]); + } + + async lte(field: string, term: string) { + const { column, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + return SqlString.format(`(${column} <= ?)`, [term]); + } + + async lt(field: string, term: string) { + const { column, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + return SqlString.format(`(${column} < ?)`, [term]); + } + + async gt(field: string, term: string) { + const { column, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + return SqlString.format(`(${column} > ?)`, [term]); + } + + // TODO: Not sure if SQL really needs this or if it'll coerce itself + private attemptToParseNumber(term: string): string | number { + const number = Number.parseFloat(term); + if (Number.isNaN(number)) { + return term; + } + return number; + } + + // Ref: https://clickhouse.com/codebrowser/ClickHouse/src/Functions/HasTokenImpl.h.html#_ZN2DB12HasTokenImpl16isTokenSeparatorEDu + // Split by anything that's ascii 0-128, that's not a letter or a number + private tokenizeTerm(term: string): string[] { + return term.split(/[ -/:-@[-`{-~\t\n\r]+/).filter(t => t.length > 0); + } + + private termHasSeperators(term: string): boolean { + return term.match(/[ -/:-@[-`{-~\t\n\r]+/) != null; + } + + async fieldSearch( + field: string, + term: string, + isNegatedField: boolean, + prefixWildcard: boolean, + suffixWildcard: boolean, + ) { + const isImplicitField = field === IMPLICIT_FIELD; + const { column, propertyType, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + // If it's a string field, we will always try to match with ilike + + if (propertyType === 'bool') { + // numeric and boolean fields must be equality matched + return SqlString.format(`(${column} ${isNegatedField ? '!' : ''}= ?)`, [ + parseInt(term), + ]); + } else if (propertyType === 'number') { + return SqlString.format( + `(${column} ${isNegatedField ? '!' : ''}= CAST(?, 'Float64'))`, + [term], + ); + } + + if (isImplicitField && this.options?.useTokenization) { + // For the _source column, we'll try to do whole word searches by default + // to utilize the token bloom filter unless a prefix/sufix wildcard is specified + if (prefixWildcard || suffixWildcard) { + return SqlString.format( + `(lower(${column}) ${isNegatedField ? 'NOT ' : ''}LIKE lower(?))`, + [`${prefixWildcard ? '%' : ''}${term}${suffixWildcard ? '%' : ''}`], + ); + } else { + // We can't search multiple tokens with `hasToken`, so we need to split up the term into tokens + const hasSeperators = this.termHasSeperators(term); + if (hasSeperators) { + const tokens = this.tokenizeTerm(term); + return `(${isNegatedField ? 'NOT (' : ''}${[ + ...tokens.map(token => + SqlString.format(`hasTokenCaseInsensitive(${column}, ?)`, [ + token, + ]), + ), + // If there are symbols in the term, we'll try to match the whole term as well (ex. Scott!) + SqlString.format(`(lower(${column}) LIKE lower(?))`, [`%${term}%`]), + ].join(' AND ')}${isNegatedField ? ')' : ''})`; + } else { + return SqlString.format( + `(${ + isNegatedField ? 'NOT ' : '' + }hasTokenCaseInsensitive(${column}, ?))`, + [term], + ); + } + } + } else { + const shoudUseTokenBf = isImplicitField && isLikelyTokenTerm(term); + return SqlString.format( + `(${column} ${isNegatedField ? 'NOT ' : ''}? ?)`, + [SqlString.raw(shoudUseTokenBf ? 'LIKE' : 'ILIKE'), `%${term}%`], + ); + } + } + + async range( + field: string, + start: string, + end: string, + isNegatedField: boolean, + ) { + const { column, found } = await this.getColumnForField(field); + if (!found) { + return this.NOT_FOUND_QUERY; + } + return SqlString.format( + `(${column} ${isNegatedField ? 'NOT ' : ''}BETWEEN ? AND ?)`, + [this.attemptToParseNumber(start), this.attemptToParseNumber(end)], + ); + } +} + +async function nodeTerm( + node: lucene.Node, + serializer: Serializer, +): Promise { + const field = node.field[0] === '-' ? node.field.slice(1) : node.field; + let isNegatedField = node.field[0] === '-'; + const isImplicitField = node.field === IMPLICIT_FIELD; + + // NodeTerm + if ((node as lucene.NodeTerm).term != null) { + const nodeTerm = node as lucene.NodeTerm; + let term = decodeSpecialTokens(nodeTerm.term); + // We should only negate the search for negated bare terms (ex. '-5') + // This meeans the field is implicit and the prefix is - + if (isImplicitField && nodeTerm.prefix === '-') { + isNegatedField = true; + } + // Otherwise, if we have a negated term for a field (ex. 'level:-5') + // we should not negate the search, and search for -5 + if (!isImplicitField && nodeTerm.prefix === '-') { + term = nodeTerm.prefix + decodeSpecialTokens(nodeTerm.term); + } + + // TODO: Decide if this is good behavior + // If the term is quoted, we should search for the exact term in a property (ex. foo:"bar") + // Implicit field searches should still use substring matching (ex. "foo bar") + if (nodeTerm.quoted && !isImplicitField) { + return serializer.eq(field, term, isNegatedField); + } + + if (!nodeTerm.quoted && term === '*') { + return serializer.isNotNull(field, isNegatedField); + } + + if (!nodeTerm.quoted && term.substring(0, 2) === '>=') { + if (isNegatedField) { + return serializer.lt(field, term.slice(2)); + } + return serializer.gte(field, term.slice(2)); + } + if (!nodeTerm.quoted && term.substring(0, 2) === '<=') { + if (isNegatedField) { + return serializer.gt(field, term.slice(2)); + } + return serializer.lte(field, term.slice(2)); + } + if (!nodeTerm.quoted && term[0] === '>') { + if (isNegatedField) { + return serializer.lte(field, term.slice(1)); + } + return serializer.gt(field, term.slice(1)); + } + if (!nodeTerm.quoted && term[0] === '<') { + if (isNegatedField) { + return serializer.gte(field, term.slice(1)); + } + return serializer.lt(field, term.slice(1)); + } + + let prefixWildcard = false; + let suffixWildcard = false; + if (!nodeTerm.quoted && term[0] === '*') { + prefixWildcard = true; + term = term.slice(1); + } + if (!nodeTerm.quoted && term[term.length - 1] === '*') { + suffixWildcard = true; + term = term.slice(0, -1); + } + + return serializer.fieldSearch( + field, + term, + isNegatedField, + prefixWildcard, + suffixWildcard, + ); + + // TODO: Handle regex, similarity, boost, prefix + } + // NodeRangedTerm + if ((node as lucene.NodeRangedTerm).inclusive != null) { + const rangedTerm = node as lucene.NodeRangedTerm; + return serializer.range( + field, + rangedTerm.term_min, + rangedTerm.term_max, + isNegatedField, + ); + } + + throw new Error(`Unexpected Node type. ${node}`); +} + +async function serialize( + ast: lucene.AST | lucene.Node, + serializer: Serializer, +): Promise { + // Node Scenarios: + // 1. NodeTerm: Single term ex. "foo:bar" + // 2. NodeRangedTerm: Two terms ex. "foo:[bar TO qux]" + if ((ast as lucene.NodeTerm).term != null) { + return await nodeTerm(ast as lucene.NodeTerm, serializer); + } + if ((ast as lucene.NodeRangedTerm).inclusive != null) { + return await nodeTerm(ast as lucene.NodeTerm, serializer); + } + + // AST Scenarios: + // 1. BinaryAST: Two terms ex. "foo:bar AND baz:qux" + // 2. LeftOnlyAST: Single term ex. "foo:bar" + if ((ast as lucene.BinaryAST).right != null) { + const binaryAST = ast as lucene.BinaryAST; + const operator = + binaryAST.operator === IMPLICIT_FIELD ? 'AND' : binaryAST.operator; + const parenthesized = binaryAST.parenthesized; + return `${parenthesized ? '(' : ''}${await serialize( + binaryAST.left, + serializer, + )} ${operator} ${await serialize(binaryAST.right, serializer)}${ + parenthesized ? ')' : '' + }`; + } + + if ((ast as lucene.LeftOnlyAST).left != null) { + const leftOnlyAST = ast as lucene.LeftOnlyAST; + const parenthesized = leftOnlyAST.parenthesized; + // start is used when ex. "NOT foo:bar" + return `${parenthesized ? '(' : ''}${ + leftOnlyAST.start != undefined ? `${leftOnlyAST.start} ` : '' + }${await serialize(leftOnlyAST.left, serializer)}${ + parenthesized ? ')' : '' + }`; + } + + // Blank AST, means no text was parsed + return ''; +} + +export async function genWhereSQL( + ast: lucene.AST, + propertyTypeMappingsModel: PropertyTypeMappingsModel, + teamId?: string, +): Promise { + const serializer = new SQLSerializer(propertyTypeMappingsModel, { + useTokenization: true, + }); + return await serialize(ast, serializer); +} + +export class SearchQueryBuilder { + private readonly searchQ: string; + + private readonly conditions: string[]; + + private readonly propertyTypeMappingsModel: PropertyTypeMappingsModel; + + teamId?: string; + + constructor( + searchQ: string, + propertyTypeMappingsModel: PropertyTypeMappingsModel, + ) { + this.conditions = []; + this.searchQ = searchQ; + this.propertyTypeMappingsModel = propertyTypeMappingsModel; + } + + private async genSearchQuery() { + if (!this.searchQ) { + return ''; + } + + let querySql = this.searchQ + .split(/\s+/) + .map(queryToken => + SqlString.format(`lower(_source) LIKE lower(?)`, [`%${queryToken}%`]), + ) + .join(' AND '); + + try { + const parsedQ = parse(this.searchQ); + + if (parsedQ) { + querySql = await genWhereSQL( + parsedQ, + this.propertyTypeMappingsModel, + this.teamId, + ); + } + } catch (e) { + console.warn({ + error: serializeError(e), + message: 'Parse failure', + query: this.searchQ, + }); + } + + return querySql; + } + + and(condition: string) { + if (condition && condition.trim()) { + this.conditions.push(`(${condition})`); + } + return this; + } + + removeInternals() { + this.and(SqlString.format('notEquals(_platform, ?)', [LogPlatform.Rrweb])); + return this; + } + + filterLogsAndSpans() { + this.and( + SqlString.format('type = ? OR type = ?', [LogType.Log, LogType.Span]), + ); + return this; + } + + // startTime and endTime are unix in ms + timestampInBetween(startTime: number, endTime: number) { + this.and( + `_timestamp_sort_key >= ${msToBigIntNs( + startTime, + )} AND _timestamp_sort_key < ${msToBigIntNs(endTime)}`, + ); + return this; + } + + async build() { + const searchQuery = await this.genSearchQuery(); + if (this.searchQ) { + this.and(searchQuery); + } + return this.conditions.join(' AND '); + } +} + +// TODO: replace with a proper query builder +export const buildSearchQueryWhereCondition = async ({ + startTime, + endTime, + query, + propertyTypeMappingsModel, + teamId, +}: { + startTime: number; // unix in ms + endTime: number; // unix in ms, + query: string; + propertyTypeMappingsModel: PropertyTypeMappingsModel; + teamId?: string; +}) => { + const builder = new SearchQueryBuilder(query, propertyTypeMappingsModel); + builder.teamId = teamId; + return await builder.timestampInBetween(startTime, endTime).build(); +}; diff --git a/packages/api/src/config.ts b/packages/api/src/config.ts new file mode 100644 index 00000000..1ebb7a41 --- /dev/null +++ b/packages/api/src/config.ts @@ -0,0 +1,35 @@ +import { version } from '../package.json'; + +const env = process.env; + +export const CODE_VERSION = version; + +export const APP_TYPE = env.APP_TYPE as 'api' | 'aggregator' | 'scheduled-task'; + +export const NODE_ENV = env.NODE_ENV as string; +export const IS_PROD = NODE_ENV === 'production'; +export const IS_DEV = NODE_ENV === 'development'; +export const IS_CI = NODE_ENV === 'ci'; + +export const PORT = Number.parseInt(env.PORT as string); +export const SERVER_URL = env.SERVER_URL as string; +export const FRONTEND_URL = env.FRONTEND_URL as string; +export const COOKIE_DOMAIN = env.COOKIE_DOMAIN as string; // prod ONLY + +export const MONGO_URI = env.MONGO_URI as string; + +export const CLICKHOUSE_HOST = env.CLICKHOUSE_HOST as string; +export const CLICKHOUSE_PASSWORD = env.CLICKHOUSE_PASSWORD as string; +export const CLICKHOUSE_USER = env.CLICKHOUSE_USER as string; + +export const HYPERDX_API_KEY = env.HYPERDX_API_KEY as string; +export const HYPERDX_INGESTOR_ENDPOINT = + env.HYPERDX_INGESTOR_ENDPOINT as string; + +export const EXPRESS_SESSION_SECRET = env.EXPRESS_SESSION_SECRET as string; + +export const REDIS_URL = env.REDIS_URL as string; + +export const MINER_API_URL = env.MINER_API_URL as string; + +export const OTEL_SERVICE_NAME = env.OTEL_SERVICE_NAME as string; diff --git a/packages/api/src/controllers/__tests__/team.test.ts b/packages/api/src/controllers/__tests__/team.test.ts new file mode 100644 index 00000000..efc29a4a --- /dev/null +++ b/packages/api/src/controllers/__tests__/team.test.ts @@ -0,0 +1,29 @@ +import { clearDBCollections, closeDB, connectDB } from '../../fixtures'; +import { createTeam, getTeam, getTeamByApiKey } from '../../controllers/team'; + +describe('team controller', () => { + beforeAll(async () => { + await connectDB(); + }); + + afterEach(async () => { + await clearDBCollections(); + }); + + afterAll(async () => { + await closeDB(); + }); + + it('createTeam + getTeam', async () => { + const team = await createTeam({ name: 'My Team' }); + + expect(team.name).toBe('My Team'); + + team.apiKey = 'apiKey'; + + await team.save(); + + expect(await getTeam(team._id)).toBeTruthy(); + expect(await getTeamByApiKey('apiKey')).toBeTruthy(); + }); +}); diff --git a/packages/api/src/controllers/team.ts b/packages/api/src/controllers/team.ts new file mode 100644 index 00000000..f27373ec --- /dev/null +++ b/packages/api/src/controllers/team.ts @@ -0,0 +1,34 @@ +import { v4 as uuidv4 } from 'uuid'; + +import Team from '../models/team'; + +import type { ObjectId } from '../models'; + +export async function isTeamExisting() { + const teamCount = await Team.countDocuments({}); + return teamCount > 0; +} + +export async function createTeam({ name }: { name: string }) { + if (await isTeamExisting()) { + throw new Error('Team already exists'); + } + + const team = new Team({ name }); + + await team.save(); + + return team; +} + +export function getTeam(id: string | ObjectId) { + return Team.findById(id); +} + +export function getTeamByApiKey(apiKey: string) { + return Team.findOne({ apiKey }); +} + +export function rotateTeamApiKey(teamId: ObjectId) { + return Team.findByIdAndUpdate(teamId, { apiKey: uuidv4() }, { new: true }); +} diff --git a/packages/api/src/controllers/user.ts b/packages/api/src/controllers/user.ts new file mode 100644 index 00000000..6070bf5a --- /dev/null +++ b/packages/api/src/controllers/user.ts @@ -0,0 +1,22 @@ +import User from '../models/user'; + +import type { ObjectId } from '../models'; + +export function findUserById(id: string) { + return User.findById(id); +} + +export function findUserByEmail(email: string) { + return User.findOne({ email }); +} + +export async function findUserByEmailInTeam( + email: string, + team: string | ObjectId, +) { + return User.findOne({ email, team }); +} + +export function findUsersByTeam(team: string | ObjectId) { + return User.find({ team }).sort({ createdAt: 1 }); +} diff --git a/packages/api/src/fixtures.ts b/packages/api/src/fixtures.ts new file mode 100644 index 00000000..28900c65 --- /dev/null +++ b/packages/api/src/fixtures.ts @@ -0,0 +1,65 @@ +import mongoose from 'mongoose'; +import request from 'supertest'; + +import * as config from './config'; +import Server from './server'; +import { createTeam } from './controllers/team'; +import { mongooseConnection } from './models'; + +export const connectDB = async () => { + if (!config.IS_CI) { + throw new Error('ONLY execute this in CI env 😈 !!!'); + } + await mongoose.connect(config.MONGO_URI); +}; + +export const closeDB = async () => { + if (!config.IS_CI) { + throw new Error('ONLY execute this in CI env 😈 !!!'); + } + await mongooseConnection.dropDatabase(); +}; + +export const clearDBCollections = async () => { + if (!config.IS_CI) { + throw new Error('ONLY execute this in CI env 😈 !!!'); + } + const collections = mongooseConnection.collections; + await Promise.all( + Object.values(collections).map(async collection => { + await collection.deleteMany({}); // an empty mongodb selector object ({}) must be passed as the filter argument + }), + ); +}; + +// after connectDB +export const initCiEnvs = async () => { + if (!config.IS_CI) { + throw new Error('ONLY execute this in CI env 😈 !!!'); + } + // create a fake team with fake api key + setup gh integration + await createTeam({ name: 'Fake Team' }); +}; + +class MockServer extends Server { + getHttpServer() { + return this.httpServer; + } + + closeHttpServer() { + return new Promise((resolve, reject) => { + this.httpServer.close(err => { + if (err) { + reject(err); + return; + } + resolve(); + }); + }); + } +} + +export const getServer = () => new MockServer(); + +export const getAgent = (server: MockServer) => + request.agent(server.getHttpServer()); diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts new file mode 100644 index 00000000..b8dce549 --- /dev/null +++ b/packages/api/src/index.ts @@ -0,0 +1,47 @@ +import { serializeError } from 'serialize-error'; + +import * as config from './config'; +import Server from './server'; +import logger from './utils/logger'; +import { initCiEnvs } from './fixtures'; +import { isOperationalError } from './utils/errors'; + +const server = new Server(); + +process.on('uncaughtException', (err: Error) => { + logger.error(serializeError(err)); + + // FIXME: disable server restart until + // we make sure all expected exceptions are handled properly + if (config.IS_DEV && !isOperationalError(err)) { + process.exit(1); + } +}); + +process.on('unhandledRejection', (err: Error) => { + // TODO: do we want to throw here ? + logger.error(serializeError(err)); +}); + +// graceful shutdown +process.on('SIGTERM', () => { + logger.info('SIGTERM signal received.'); + + if (config.IS_DEV) { + logger.info('Http server is forced to stop immediately.'); + process.exit(0); + } + + server.stop(); +}); + +server + .start() + .then(() => { + // TODO: a quick hack to work with e2e. We should do this in separate op + if (config.IS_CI) { + // place where we setup fake data for CI + return initCiEnvs(); + } + }) + .catch(e => logger.error(serializeError(e))); diff --git a/packages/api/src/middleware/auth.ts b/packages/api/src/middleware/auth.ts new file mode 100644 index 00000000..ce86e71b --- /dev/null +++ b/packages/api/src/middleware/auth.ts @@ -0,0 +1,76 @@ +import type { Request, Response, NextFunction } from 'express'; + +import { serializeError } from 'serialize-error'; +import { setTraceAttributes } from '@hyperdx/node-opentelemetry'; + +import * as config from '../config'; +import logger from '../utils/logger'; + +import type { UserDocument } from '../models/user'; + +declare global { + namespace Express { + interface User extends UserDocument {} + } +} + +declare module 'express-session' { + interface Session { + messages: string[]; // Set by passport + passport: { user: string }; // Set by passport + } +} + +export function redirectToDashboard(req: Request, res: Response) { + if (req?.user?.team) { + return res.redirect(`${config.FRONTEND_URL}/search`); + } else { + logger.error( + `Password login for user failed, user or team not found ${req?.user?._id}`, + ); + res.redirect(`${config.FRONTEND_URL}/login?err=unknown`); + } +} + +export function handleAuthError( + err: any, + req: Request, + res: Response, + next: NextFunction, +) { + logger.debug({ message: 'Auth error', authErr: serializeError(err) }); + if (res.headersSent) { + return next(err); + } + + // Get the latest auth error message + const lastMessage = req.session.messages?.at(-1); + logger.debug(`Auth error last message: ${lastMessage}`); + + const returnErr = + lastMessage === 'Password or username is incorrect' + ? 'authFail' + : lastMessage === + 'Authentication method password is not allowed by your team admin.' + ? 'passwordAuthNotAllowed' + : 'unknown'; + + res.redirect(`${config.FRONTEND_URL}/login?err=${returnErr}`); +} + +export function isUserAuthenticated( + req: Request, + res: Response, + next: NextFunction, +) { + if (req.isAuthenticated()) { + // set user id as trace attribute + setTraceAttributes({ + userId: req.user?._id.toString(), + userEmail: req.user?.email, + }); + + return next(); + } + res.sendStatus(401); +} diff --git a/packages/api/src/middleware/cors.ts b/packages/api/src/middleware/cors.ts new file mode 100644 index 00000000..bc9f6f92 --- /dev/null +++ b/packages/api/src/middleware/cors.ts @@ -0,0 +1,6 @@ +import cors from 'cors'; +import { FRONTEND_URL } from '../config'; + +export const noCors = cors(); + +export default cors({ credentials: true, origin: FRONTEND_URL }); diff --git a/packages/api/src/middleware/error.ts b/packages/api/src/middleware/error.ts new file mode 100644 index 00000000..f3d9fd3a --- /dev/null +++ b/packages/api/src/middleware/error.ts @@ -0,0 +1,29 @@ +import type { Request, Response, NextFunction } from 'express'; + +import { serializeError } from 'serialize-error'; + +import logger from '../utils/logger'; +import { BaseError, StatusCode, isOperationalError } from '../utils/errors'; + +// WARNING: need to keep the 4th arg for express to identify it as an error-handling middleware function +export const appErrorHandler = ( + err: BaseError, + _: Request, + res: Response, + next: NextFunction, +) => { + logger.error({ + location: 'appErrorHandler', + error: serializeError(err), + }); + + const userFacingErrorMessage = isOperationalError(err) + ? err.message + : 'Something went wrong :('; + + if (!res.headersSent) { + res + .status(err.statusCode ?? StatusCode.INTERNAL_SERVER) + .send(userFacingErrorMessage); + } +}; diff --git a/packages/api/src/models/alert.ts b/packages/api/src/models/alert.ts new file mode 100644 index 00000000..65a7e699 --- /dev/null +++ b/packages/api/src/models/alert.ts @@ -0,0 +1,87 @@ +import mongoose, { Schema } from 'mongoose'; + +import type { ObjectId } from '.'; + +export type AlertType = 'presence' | 'absence'; + +export enum AlertState { + ALERT = 'ALERT', + DISABLED = 'DISABLED', + INSUFFICIENT_DATA = 'INSUFFICIENT_DATA', + OK = 'OK', +} + +// follow 'ms' pkg formats +export type AlertInterval = + | '1m' + | '5m' + | '15m' + | '30m' + | '1h' + | '6h' + | '12h' + | '1d'; + +export type AlertChannel = { + type: 'webhook'; + webhookId: string; +}; + +export interface IAlert { + _id: ObjectId; + channel: AlertChannel; + cron: string; + groupBy?: string; + interval: AlertInterval; + logView: ObjectId; + message?: string; + state: AlertState; + threshold: number; + timezone: string; + type: AlertType; +} + +const AlertSchema = new Schema( + { + type: { + type: String, + required: true, + }, + message: { + type: String, + required: false, + }, + threshold: { + type: Number, + required: true, + }, + interval: { + type: String, + required: true, + }, + timezone: { + type: String, + required: true, + }, + cron: { + type: String, + required: true, + }, + channel: Schema.Types.Mixed, // slack, email, etc + logView: { type: mongoose.Schema.Types.ObjectId, ref: 'Alert' }, + state: { + type: String, + enum: AlertState, + default: AlertState.OK, + }, + groupBy: { + type: String, + required: false, + }, + }, + { + timestamps: true, + }, +); + +export default mongoose.model('Alert', AlertSchema); diff --git a/packages/api/src/models/alertHistory.ts b/packages/api/src/models/alertHistory.ts new file mode 100644 index 00000000..bbda301b --- /dev/null +++ b/packages/api/src/models/alertHistory.ts @@ -0,0 +1,32 @@ +import mongoose, { Schema } from 'mongoose'; +import ms from 'ms'; + +import type { ObjectId } from '.'; + +export interface IAlertHistory { + alert: ObjectId; + counts: number; + createdAt: Date; +} + +const AlertHistorySchema = new Schema({ + counts: { + type: Number, + default: 0, + }, + createdAt: { + type: Date, + required: true, + }, + alert: { type: mongoose.Schema.Types.ObjectId, ref: 'Alert' }, +}); + +AlertHistorySchema.index( + { createdAt: 1 }, + { expireAfterSeconds: ms('30d') / 1000 }, +); + +export default mongoose.model( + 'AlertHistory', + AlertHistorySchema, +); diff --git a/packages/api/src/models/dashboard.ts b/packages/api/src/models/dashboard.ts new file mode 100644 index 00000000..cfd57cf1 --- /dev/null +++ b/packages/api/src/models/dashboard.ts @@ -0,0 +1,28 @@ +import mongoose, { Schema } from 'mongoose'; + +import type { ObjectId } from '.'; + +export interface IDashboard { + _id: ObjectId; + name: string; + query: string; + team: ObjectId; + charts: any[]; // TODO: Type this eventually +} + +const DashboardSchema = new Schema( + { + name: { + type: String, + required: true, + }, + query: String, + team: { type: mongoose.Schema.Types.ObjectId, ref: 'Team' }, + charts: { type: mongoose.Schema.Types.Mixed, required: true }, + }, + { + timestamps: true, + }, +); + +export default mongoose.model('Dashboard', DashboardSchema); diff --git a/packages/api/src/models/index.ts b/packages/api/src/models/index.ts new file mode 100644 index 00000000..6d710256 --- /dev/null +++ b/packages/api/src/models/index.ts @@ -0,0 +1,44 @@ +import mongoose from 'mongoose'; + +import * as config from '../config'; +import logger from '../utils/logger'; + +export type ObjectId = mongoose.Types.ObjectId; + +// set flags +mongoose.set('strictQuery', true); + +// Allow empty strings to be set to required fields +// https://github.com/Automattic/mongoose/issues/7150 +// ex. query in logview can be empty +mongoose.Schema.Types.String.checkRequired(v => v != null); + +// connection events handlers +mongoose.connection.on('connected', () => { + logger.info('Connection established to MongoDB'); +}); + +mongoose.connection.on('disconnected', () => { + logger.info('Lost connection to MongoDB server'); +}); + +mongoose.connection.on('error', () => { + logger.error('Could not connect to MongoDB'); +}); + +mongoose.connection.on('reconnected', () => { + logger.error('Reconnected to MongoDB'); +}); + +mongoose.connection.on('reconnectFailed', () => { + logger.error('Failed to reconnect to MongoDB'); +}); + +export const connectDB = async () => { + await mongoose.connect(config.MONGO_URI, { + heartbeatFrequencyMS: 10000, // retry failed heartbeats + maxPoolSize: 100, // 5 nodes -> max 1000 connections + }); +}; + +export const mongooseConnection = mongoose.connection; diff --git a/packages/api/src/models/logView.ts b/packages/api/src/models/logView.ts new file mode 100644 index 00000000..9326dc2a --- /dev/null +++ b/packages/api/src/models/logView.ts @@ -0,0 +1,31 @@ +import mongoose, { Schema } from 'mongoose'; + +import type { ObjectId } from '.'; + +export interface ILogView { + _id: ObjectId; + creator: ObjectId; + name: string; + query: string; + team: ObjectId; +} + +const LogViewSchema = new Schema( + { + query: { + type: String, + required: true, + }, + name: { + type: String, + required: true, + }, + team: { type: mongoose.Schema.Types.ObjectId, ref: 'Team' }, + creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, + }, + { + timestamps: true, + }, +); + +export default mongoose.model('LogView', LogViewSchema); diff --git a/packages/api/src/models/team.ts b/packages/api/src/models/team.ts new file mode 100644 index 00000000..67c0853f --- /dev/null +++ b/packages/api/src/models/team.ts @@ -0,0 +1,39 @@ +import mongoose, { Schema } from 'mongoose'; +import { v4 as uuidv4 } from 'uuid'; + +type ObjectId = mongoose.Types.ObjectId; + +export interface ITeam { + _id: ObjectId; + name: string; + logStreamTableVersion?: number; + allowedAuthMethods?: 'password'[]; + apiKey: string; + hookId: string; +} + +export default mongoose.model( + 'Team', + new Schema( + { + name: String, + allowedAuthMethods: [String], + hookId: { + type: String, + default: function genUUID() { + return uuidv4(); + }, + }, + apiKey: { + type: String, + default: function genUUID() { + return uuidv4(); + }, + }, + logStreamTableVersion: Number, + }, + { + timestamps: true, + }, + ), +); diff --git a/packages/api/src/models/teamInvite.ts b/packages/api/src/models/teamInvite.ts new file mode 100644 index 00000000..7ce44843 --- /dev/null +++ b/packages/api/src/models/teamInvite.ts @@ -0,0 +1,36 @@ +import mongoose, { Schema } from 'mongoose'; + +export interface ITeamInvite { + createdAt: Date; + email: string; + name?: string; + teamId: string; + token: string; + updatedAt: Date; +} + +const TeamInviteSchema = new Schema( + { + teamId: { + type: Schema.Types.ObjectId, + ref: 'Team', + required: true, + }, + name: String, + email: { + type: String, + required: true, + }, + token: { + type: String, + required: true, + }, + }, + { + timestamps: true, + }, +); + +TeamInviteSchema.index({ teamId: 1, email: 1 }, { unique: true }); + +export default mongoose.model('TeamInvite', TeamInviteSchema); diff --git a/packages/api/src/models/user.ts b/packages/api/src/models/user.ts new file mode 100644 index 00000000..0d4cb522 --- /dev/null +++ b/packages/api/src/models/user.ts @@ -0,0 +1,44 @@ +import mongoose, { Schema } from 'mongoose'; +import { v4 as uuidv4 } from 'uuid'; +// @ts-ignore don't install the @types for this package, as it conflicts with mongoose +import passportLocalMongoose from 'passport-local-mongoose'; + +type ObjectId = mongoose.Types.ObjectId; + +export interface IUser { + _id: ObjectId; + createdAt: Date; + email: string; + name: string; + team: ObjectId; +} + +export type UserDocument = mongoose.HydratedDocument; + +const UserSchema = new Schema( + { + name: String, + email: { + type: String, + required: true, + }, + team: { type: mongoose.Schema.Types.ObjectId, ref: 'Team' }, + }, + { + timestamps: true, + }, +); + +UserSchema.virtual('hasPasswordAuth').get(function (this: IUser) { + return true; +}); + +UserSchema.plugin(passportLocalMongoose, { + usernameField: 'email', + usernameLowerCase: true, + usernameCaseInsensitive: true, +}); + +UserSchema.index({ email: 1 }, { unique: true }); + +export default mongoose.model('User', UserSchema); diff --git a/packages/api/src/models/webhook.ts b/packages/api/src/models/webhook.ts new file mode 100644 index 00000000..9d11f925 --- /dev/null +++ b/packages/api/src/models/webhook.ts @@ -0,0 +1,26 @@ +import mongoose, { Schema } from 'mongoose'; + +import { ObjectId } from 'mongodb'; + +export interface IWebhook { + _id: ObjectId; + createdAt: Date; + name: string; + service: string; + team: ObjectId; + updatedAt: Date; + url: string; +} + +export default mongoose.model( + 'Webhook', + new Schema( + { + team: { type: Schema.Types.ObjectId, ref: 'Team' }, + service: String, + name: String, + url: String, + }, + { timestamps: true }, + ), +); diff --git a/packages/api/src/routers/aggregator/index.ts b/packages/api/src/routers/aggregator/index.ts new file mode 100644 index 00000000..67235cb0 --- /dev/null +++ b/packages/api/src/routers/aggregator/index.ts @@ -0,0 +1,5 @@ +import rootRouter from './root'; + +export default { + rootRouter, +}; diff --git a/packages/api/src/routers/aggregator/root.ts b/packages/api/src/routers/aggregator/root.ts new file mode 100644 index 00000000..e5fc12fe --- /dev/null +++ b/packages/api/src/routers/aggregator/root.ts @@ -0,0 +1,127 @@ +import express from 'express'; +import groupBy from 'lodash/groupBy'; + +import * as config from '../../config'; +import logger from '../../utils/logger'; +import { + bulkInsertRrwebEvents, + bulkInsertTeamLogStream, + bulkInsertTeamMetricStream, +} from '../../clickhouse'; +import { + extractApiKey, + vectorLogParser, + vectorMetricParser, + vectorRrwebParser, +} from '../../utils/logParser'; +import { getTeamByApiKey } from '../../controllers/team'; + +import type { VectorLog, VectorMetric } from '../../utils/logParser'; + +const router = express.Router(); + +const bulkInsert = async ( + hdxTelemetry: string | undefined, + apiKey: string, + data: (VectorLog | VectorMetric)[], +) => { + const team = await getTeamByApiKey(apiKey); + if (team) { + switch (hdxTelemetry) { + case 'metric': + await bulkInsertTeamMetricStream( + vectorMetricParser.parse(data as VectorMetric[]), + ); + break; + default: { + const rrwebEvents = []; + const logs = []; + for (const log of data) { + if (log.hdx_platform === 'rrweb') { + rrwebEvents.push(log); + } else { + logs.push(log); + } + } + const promises = [ + bulkInsertTeamLogStream( + team.logStreamTableVersion, + team._id.toString(), + vectorLogParser.parse(logs as VectorLog[]), + ), + ]; + if (rrwebEvents.length > 0) { + promises.push( + bulkInsertRrwebEvents( + vectorRrwebParser.parse(rrwebEvents as VectorLog[]), + ), + ); + } + await Promise.all(promises); + break; + } + } + } +}; + +router.get('/health', (_, res) => { + res.send({ data: 'OK', version: config.CODE_VERSION }); +}); + +// bulk insert logs +router.post('/', async (req, res, next) => { + const { telemetry } = req.query; + const hdxTelemetry = (telemetry ?? 'log') as string; + try { + const logs: (VectorLog | VectorMetric)[] = req.body; + if (!Array.isArray(logs)) { + return res.sendStatus(400); + } + // TODO: move this to the end of the request so vector will buffer the logs + // Need to check request.timeout_secs config + res.sendStatus(200); + + logger.info({ + message: `Received ${hdxTelemetry}`, + size: JSON.stringify(logs).length, + n: logs.length, + }); + + const filteredLogs = logs + .map(log => ({ + ...log, + hdx_apiKey: extractApiKey(log), + })) + // check hdx_platform values ? + .filter(log => log.hdx_platform && log.hdx_apiKey); + + if (logs.length - filteredLogs.length > 0) { + // TEMP: DEBUGGING (remove later) + const droppedLogs = logs + .map(log => ({ + ...log, + hdx_apiKey: extractApiKey(log), + })) + .filter(log => !log.hdx_platform || !log.hdx_apiKey); + logger.info({ + message: `Dropped ${hdxTelemetry}`, + n: filteredLogs.length, + diff: logs.length - filteredLogs.length, + droppedLogs, + }); + } + + if (filteredLogs.length > 0) { + const groupedLogs = groupBy(filteredLogs, 'hdx_apiKey'); + await Promise.all( + Object.entries(groupedLogs).map(([apiKey, logs]) => + bulkInsert(hdxTelemetry, apiKey, logs), + ), + ); + } + } catch (e) { + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/__tests__/team.test.ts b/packages/api/src/routers/api/__tests__/team.test.ts new file mode 100644 index 00000000..39da92d5 --- /dev/null +++ b/packages/api/src/routers/api/__tests__/team.test.ts @@ -0,0 +1,85 @@ +import _ from 'lodash'; + +import { + clearDBCollections, + closeDB, + getAgent, + getServer, +} from '../../../fixtures'; +import { getTeam } from '../../../controllers/team'; +import { findUserByEmail } from '../../../controllers/user'; + +describe('team router', () => { + const server = getServer(); + + const login = async () => { + const agent = getAgent(server); + + await agent + .post('/register/password') + .send({ + email: 'fake@deploysentinel.com', + password: 'tacocat1234', + }) + .expect(302); + + const user = await findUserByEmail('fake@deploysentinel.com'); + const team = await getTeam(user?.team as any); + + if (team === null || user === null) { + throw Error('team or user not found'); + } + + await user.save(); + + // login app + await agent + .post('/login/password') + .send({ + email: 'fake@deploysentinel.com', + password: 'tacocat1234', + }) + .expect(302); + + return { + agent, + team, + user, + }; + }; + + beforeAll(async () => { + await server.start(); + }); + + afterEach(async () => { + await clearDBCollections(); + }); + + afterAll(async () => { + await server.closeHttpServer(); + await closeDB(); + }); + + it('GET /team', async () => { + const { agent } = await login(); + + const resp = await agent.get('/team').expect(200); + + expect(_.omit(resp.body, ['_id', 'apiKey'])).toMatchInlineSnapshot(` +Object { + "allowedAuthMethods": Array [], + "name": "fake@deploysentinel.com's Team", + "teamInvites": Array [], + "users": Array [ + Object { + "email": "fake@deploysentinel.com", + "hasPasswordAuth": true, + "isCurrentUser": true, + "name": "fake@deploysentinel.com", + }, + ], +} +`); + }); +}); diff --git a/packages/api/src/routers/api/alerts.ts b/packages/api/src/routers/api/alerts.ts new file mode 100644 index 00000000..4c045f94 --- /dev/null +++ b/packages/api/src/routers/api/alerts.ts @@ -0,0 +1,223 @@ +import express from 'express'; +import ms from 'ms'; +import { getHours, getMinutes } from 'date-fns'; + +import Alert, { + AlertChannel, + AlertInterval, + AlertType, +} from '../../models/alert'; +import * as clickhouse from '../../clickhouse'; +import { SQLSerializer } from '../../clickhouse/searchQueryParser'; +import { getTeam } from '../../controllers/team'; +import { isUserAuthenticated } from '../../middleware/auth'; + +const router = express.Router(); + +const getCron = (interval: AlertInterval) => { + const now = new Date(); + const nowMins = getMinutes(now); + const nowHours = getHours(now); + + switch (interval) { + case '1m': + return '* * * * *'; + case '5m': + return '*/5 * * * *'; + case '15m': + return '*/15 * * * *'; + case '30m': + return '*/30 * * * *'; + case '1h': + return `${nowMins} * * * *`; + case '6h': + return `${nowMins} */6 * * *`; + case '12h': + return `${nowMins} */12 * * *`; + case '1d': + return `${nowMins} ${nowHours} * * *`; + } +}; + +const createAlert = async ({ + channel, + groupBy, + interval, + logViewId, + threshold, + type, +}: { + channel: AlertChannel; + groupBy?: string; + interval: AlertInterval; + logViewId: string; + threshold: number; + type: AlertType; +}) => { + return new Alert({ + channel, + cron: getCron(interval), + groupBy, + interval, + logView: logViewId, + threshold, + timezone: 'UTC', // TODO: support different timezone + type, + }).save(); +}; + +// create an update alert function based off of the above create alert function +const updateAlert = async ({ + channel, + groupBy, + id, + interval, + logViewId, + threshold, + type, +}: { + channel: AlertChannel; + groupBy?: string; + id: string; + interval: AlertInterval; + logViewId: string; + threshold: number; + type: AlertType; +}) => { + return Alert.findByIdAndUpdate( + id, + { + channel, + cron: getCron(interval), + groupBy: groupBy ?? null, + interval, + logView: logViewId, + threshold, + timezone: 'UTC', // TODO: support different timezone + type, + }, + { + returnDocument: 'after', + }, + ); +}; + +router.post('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { channel, groupBy, interval, logViewId, threshold, type } = req.body; + if (teamId == null) { + return res.sendStatus(403); + } + if (!channel || !threshold || !interval || !type) { + return res.sendStatus(400); + } + if (!['slack', 'email', 'pagerduty', 'webhook'].includes(channel.type)) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + // validate groupBy property + if (groupBy) { + const nowInMs = Date.now(); + const propertyTypeMappingsModel = + await clickhouse.buildLogsPropertyTypeMappingsModel( + team.logStreamTableVersion, + teamId.toString(), + nowInMs - ms('1d'), + nowInMs, + ); + const serializer = new SQLSerializer(propertyTypeMappingsModel); + const { found } = await serializer.getColumnForField(groupBy); + if (!found) { + return res.sendStatus(400); + } + } + + res.json({ + data: await createAlert({ + channel, + groupBy, + interval, + logViewId, + threshold, + type, + }), + }); + } catch (e) { + next(e); + } +}); + +router.put('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { id: alertId } = req.params; + const { channel, interval, logViewId, threshold, type, groupBy } = req.body; + if (teamId == null) { + return res.sendStatus(403); + } + if (!channel || !threshold || !interval || !type || !alertId) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + // validate groupBy property + if (groupBy) { + const nowInMs = Date.now(); + const propertyTypeMappingsModel = + await clickhouse.buildLogsPropertyTypeMappingsModel( + team.logStreamTableVersion, + teamId.toString(), + nowInMs - ms('1d'), + nowInMs, + ); + const serializer = new SQLSerializer(propertyTypeMappingsModel); + const { found } = await serializer.getColumnForField(groupBy); + if (!found) { + return res.sendStatus(400); + } + } + + res.json({ + data: await updateAlert({ + channel, + groupBy, + id: alertId, + interval, + logViewId, + threshold, + type, + }), + }); + } catch (e) { + next(e); + } +}); + +router.delete('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { id: alertId } = req.params; + if (teamId == null) { + return res.sendStatus(403); + } + if (!alertId) { + return res.sendStatus(400); + } + await Alert.findByIdAndDelete(alertId); + res.sendStatus(200); + } catch (e) { + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/dashboards.ts b/packages/api/src/routers/api/dashboards.ts new file mode 100644 index 00000000..395e2f11 --- /dev/null +++ b/packages/api/src/routers/api/dashboards.ts @@ -0,0 +1,156 @@ +import express from 'express'; + +import Dashboard from '../../models/dashboard'; +import { isUserAuthenticated } from '../../middleware/auth'; +import { validateRequest } from 'zod-express-middleware'; +import { z } from 'zod'; + +// create routes that will get and update dashboards +const router = express.Router(); + +const zChart = z.object({ + id: z.string(), + name: z.string(), + x: z.number(), + y: z.number(), + w: z.number(), + h: z.number(), + series: z.array( + // We can't do a strict validation here since mongo and the frontend + // have a bug where chart types will not delete extraneous properties + // when attempting to save. + z.object({ + type: z.enum([ + 'time', + 'histogram', + 'search', + 'number', + 'table', + 'markdown', + ]), + table: z.string().optional(), + aggFn: z.string().optional(), // TODO: Replace with the actual AggFn schema + field: z.union([z.string(), z.undefined()]).optional(), + where: z.string().optional(), + groupBy: z.array(z.string()).optional(), + sortOrder: z.union([z.literal('desc'), z.literal('asc')]).optional(), + content: z.string().optional(), + }), + ), +}); + +router.get('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + + const dashboards = await Dashboard.find( + { team: teamId }, + { _id: 1, name: 1, createdAt: 1, updatedAt: 1, charts: 1, query: 1 }, + ).sort({ name: -1 }); + + res.json({ + data: dashboards, + }); + } catch (e) { + next(e); + } +}); + +router.post( + '/', + isUserAuthenticated, + validateRequest({ + body: z.object({ + name: z.string(), + charts: z.array(zChart), + query: z.string(), + }), + }), + async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + + const { name, charts, query } = req.body ?? {}; + // Create new dashboard from name and charts + const newDashboard = await new Dashboard({ + name, + charts, + query, + team: teamId, + }).save(); + + res.json({ + data: newDashboard, + }); + } catch (e) { + next(e); + } + }, +); + +router.put( + '/:id', + isUserAuthenticated, + validateRequest({ + body: z.object({ + name: z.string(), + charts: z.array(zChart), + query: z.string(), + }), + }), + async (req, res, next) => { + try { + const teamId = req.user?.team; + const { id: dashboardId } = req.params; + if (teamId == null) { + return res.sendStatus(403); + } + if (!dashboardId) { + return res.sendStatus(400); + } + + const { name, charts, query } = req.body ?? {}; + // Update dashboard from name and charts + const updatedDashboard = await Dashboard.findByIdAndUpdate( + dashboardId, + { + name, + charts, + query, + }, + { new: true }, + ); + + res.json({ + data: updatedDashboard, + }); + } catch (e) { + next(e); + } + }, +); + +router.delete('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { id: dashboardId } = req.params; + if (teamId == null) { + return res.sendStatus(403); + } + if (!dashboardId) { + return res.sendStatus(400); + } + await Dashboard.findByIdAndDelete(dashboardId); + res.json({}); + } catch (e) { + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/index.ts b/packages/api/src/routers/api/index.ts new file mode 100644 index 00000000..0a610eb3 --- /dev/null +++ b/packages/api/src/routers/api/index.ts @@ -0,0 +1,21 @@ +import alertsRouter from './alerts'; +import dashboardRouter from './dashboards'; +import logViewsRouter from './logViews'; +import logsRouter from './logs'; +import metricsRouter from './metrics'; +import rootRouter from './root'; +import sessionsRouter from './sessions'; +import teamRouter from './team'; +import webhooksRouter from './webhooks'; + +export default { + alertsRouter, + dashboardRouter, + logViewsRouter, + logsRouter, + metricsRouter, + rootRouter, + sessionsRouter, + teamRouter, + webhooksRouter, +}; diff --git a/packages/api/src/routers/api/logViews.ts b/packages/api/src/routers/api/logViews.ts new file mode 100644 index 00000000..eacca96b --- /dev/null +++ b/packages/api/src/routers/api/logViews.ts @@ -0,0 +1,109 @@ +import express from 'express'; + +import Alert from '../../models/alert'; +import LogView from '../../models/logView'; +import { isUserAuthenticated } from '../../middleware/auth'; + +const router = express.Router(); + +router.post('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const userId = req.user?._id; + const { query, name } = req.body; + if (teamId == null) { + return res.sendStatus(403); + } + if (query == null || !name) { + return res.sendStatus(400); + } + const logView = await new LogView({ + name, + query: `${query}`, + team: teamId, + creator: userId, + }).save(); + + res.json({ + data: logView, + }); + } catch (e) { + next(e); + } +}); + +router.get('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + const logViews = await LogView.find( + { team: teamId }, + { + name: 1, + query: 1, + createdAt: 1, + updatedAt: 1, + }, + ).sort({ createdAt: -1 }); + const allAlerts = await Promise.all( + logViews.map(lv => Alert.find({ logView: lv._id }, { __v: 0 })), + ); + res.json({ + data: logViews.map((lv, idx) => ({ + ...lv.toJSON(), + alerts: allAlerts[idx], + })), + }); + } catch (e) { + next(e); + } +}); + +router.patch('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { id: logViewId } = req.params; + const { query } = req.body; + if (teamId == null) { + return res.sendStatus(403); + } + if (!logViewId || !query) { + return res.sendStatus(400); + } + const logView = await LogView.findByIdAndUpdate( + logViewId, + { + query, + }, + { new: true }, + ); + res.json({ + data: logView, + }); + } catch (e) { + next(e); + } +}); + +router.delete('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { id: logViewId } = req.params; + if (teamId == null) { + return res.sendStatus(403); + } + if (!logViewId) { + return res.sendStatus(400); + } + // delete all alerts + await Alert.deleteMany({ logView: logViewId }); + await LogView.findByIdAndDelete(logViewId); + res.sendStatus(200); + } catch (e) { + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/logs.ts b/packages/api/src/routers/api/logs.ts new file mode 100644 index 00000000..743c6a32 --- /dev/null +++ b/packages/api/src/routers/api/logs.ts @@ -0,0 +1,527 @@ +import express from 'express'; +import ms from 'ms'; +import opentelemetry, { SpanStatusCode } from '@opentelemetry/api'; +import { isNumber, omit, parseInt } from 'lodash'; +import { serializeError } from 'serialize-error'; +import { validateRequest } from 'zod-express-middleware'; +import { z } from 'zod'; + +import * as clickhouse from '../../clickhouse'; +import { isUserAuthenticated } from '../../middleware/auth'; +import logger from '../../utils/logger'; +import { LimitedSizeQueue } from '../../utils/queue'; +import { customColumnMapType } from '../../clickhouse/searchQueryParser'; +import { getLogsPatterns } from '../../utils/miner'; +import { getTeam } from '../../controllers/team'; + +const router = express.Router(); + +router.get('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { endTime, offset, q, startTime, order, limit } = req.query; + let { extraFields } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + + if (extraFields == null) { + extraFields = []; + } + + if ( + !Array.isArray(extraFields) || + (extraFields?.length > 0 && typeof extraFields[0] != 'string') + ) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + const MAX_LIMIT = 4000; + + res.json( + await clickhouse.getLogBatch({ + extraFields: extraFields as string[], + endTime: parseInt(endTime as string), + limit: Number.isInteger(Number.parseInt(`${limit}`)) + ? Math.min(MAX_LIMIT, Number.parseInt(`${limit}`)) + : 100, + offset: parseInt(offset as string), + q: q as string, + order: order === 'null' ? null : order === 'asc' ? 'asc' : 'desc', + startTime: parseInt(startTime as string), + tableVersion: team.logStreamTableVersion, + teamId: teamId.toString(), + }), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + + next(e); + } +}); + +router.get('/patterns', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { endTime, q, startTime, sampleRate } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + if (!endTime || !startTime) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + const MAX_LOG_BODY_LENGTH = 512; + const MAX_LOG_GROUPS = 1e4; + const MAX_SAMPLES = 50; + const TOTAL_TRENDS_BUCKETS = 15; + const SAMPLE_RATE = sampleRate ? parseFloat(sampleRate as string) : 1; // TODO: compute this dynamically + const scaleSampleCounts = (count: number) => + Math.round(count / SAMPLE_RATE); + + const msRange = parseInt(endTime as string) - parseInt(startTime as string); + const interval = clickhouse.msRangeToHistogramInterval( + msRange, + TOTAL_TRENDS_BUCKETS, + ); + + const logs = await clickhouse.getLogBatchGroupedByBody({ + bodyMaxLength: MAX_LOG_BODY_LENGTH, + endTime: parseInt(endTime as string), + interval, + limit: MAX_LOG_GROUPS, + q: q as string, + sampleRate: SAMPLE_RATE, + startTime: parseInt(startTime as string), + tableVersion: team.logStreamTableVersion, + teamId: teamId.toString(), + }); + + if (logs.data.length === 0) { + return res.json({ data: [] }); + } + + // use the 1st id as the representative id + const lines = logs.data.map(log => [log.ids[0], log.body]); + // TODO: separate patterns by service + const logsPatternsData = await getLogsPatterns(teamId.toString(), lines); + type Sample = { + id: string; + body: string; + timestamp: string; + sort_key: string; + }; + const result: Record< + string, + { + count: number; + level: string; + patternId: string; + samples: LimitedSizeQueue; + service: string; + trends: Record; + } + > = {}; + for (const log of logs.data) { + const patternId = logsPatternsData.result[log.ids[0]]; + if (patternId) { + const pattern = logsPatternsData.patterns[patternId]; + if (!(pattern in result)) { + result[pattern] = { + count: 0, + level: log.level, + patternId, + samples: new LimitedSizeQueue(MAX_SAMPLES), + service: log.service, // FIXME: multiple services might share the same pattern + trends: {}, + }; + } + + for (const [idx, timestamp] of log.timestamps.entries()) { + result[pattern].samples.enqueue({ + body: log.body, + id: log.ids[idx], + sort_key: log.sort_keys[idx], + timestamp, + }); + + // compute trends + const bucket = log.buckets[idx]; + if (!(bucket in result[pattern].trends)) { + result[pattern].trends[bucket] = 0; + } + result[pattern].trends[bucket] += scaleSampleCounts(1); + } + result[pattern].count += scaleSampleCounts(parseInt(log.lines_count)); + } + } + + res.json({ + data: Object.entries(result) + .map(([pattern, meta]) => ({ + count: meta.count, + level: meta.level, + pattern, + id: meta.patternId, + samples: meta.samples + .toArray() + .sort( + (a, b) => + new Date(b.timestamp).getTime() - + new Date(a.timestamp).getTime(), + ), + service: meta.service, + trends: { + granularity: interval, + data: Object.entries(meta.trends) + .map(([bucket, count]) => ({ + bucket, + count, + })) + .sort( + (a, b) => + new Date(a.bucket).getTime() - new Date(b.bucket).getTime(), + ), + }, + })) + .sort((a, b) => b.count - a.count), + }); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + + next(e); + } +}); + +router.get('/stream', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { endTime, offset, q, startTime, order, limit } = req.query; + let { extraFields } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + + if (extraFields == null) { + extraFields = []; + } + + if ( + !Array.isArray(extraFields) || + (extraFields?.length > 0 && typeof extraFields[0] != 'string') + ) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + const MAX_LIMIT = 4000; + + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Content-Type', 'text/event-stream'); + res.setHeader('Connection', 'keep-alive'); + res.flushHeaders(); // flush the headers to establish SSE with client + + // TODO: verify query + const stream = await clickhouse.getLogStream({ + extraFields: extraFields as string[], + endTime: parseInt(endTime as string), + limit: Number.isInteger(Number.parseInt(`${limit}`)) + ? Math.min(MAX_LIMIT, Number.parseInt(`${limit}`)) + : 100, + offset: parseInt(offset as string), + order: order === 'null' ? null : order === 'asc' ? 'asc' : 'desc', + q: q as string, + startTime: parseInt(startTime as string), + tableVersion: team.logStreamTableVersion, + teamId: teamId.toString(), + }); + + let resultCount = 0; + + if (stream == null) { + logger.info('No results found for query'); + + res.write('event: end\ndata:\n\n'); + res.end(); + } else { + stream.on('data', (rows: any[]) => { + resultCount += rows.length; + logger.info(`Sending ${rows.length} rows`); + + res.write(`${rows.map(row => `data: ${row.text}`).join('\n')}\n\n`); + res.flush(); + }); + stream.on('end', () => { + res.write('event: end\ndata:\n\n'); + res.end(); + }); + } + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + // WARNING: no need to call next(e) here, as the stream will be closed + logger.error({ + message: 'Error streaming logs', + error: serializeError(e), + teamId: req.user?.team, + query: req.query, + }); + res.end(); + } +}); + +router.get( + '/propertyTypeMappings', + isUserAuthenticated, + async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + const nowInMs = Date.now(); + const propertyTypeMappingsModel = + await clickhouse.buildLogsPropertyTypeMappingsModel( + team.logStreamTableVersion, + teamId.toString(), + nowInMs - ms('1d'), + nowInMs, + ); + + res.json({ + data: [ + ...propertyTypeMappingsModel.currentPropertyTypeMappings, + ...Object.entries(omit(customColumnMapType, [''])), + ], + }); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + next(e); + } + }, +); + +router.get('/chart/histogram', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { endTime, field, q, startTime } = req.query; + if (teamId == null || typeof field !== 'string' || field == '') { + return res.sendStatus(403); + } + const startTimeNum = parseInt(startTime as string); + const endTimeNum = parseInt(endTime as string); + if (!isNumber(startTimeNum) || !isNumber(endTimeNum)) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + res.json( + await clickhouse.getChartHistogram({ + bins: 20, + endTime: endTimeNum, + field: field as string, + q: q as string, + startTime: startTimeNum, + tableVersion: team.logStreamTableVersion, + teamId: teamId.toString(), + }), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + next(e); + } +}); + +router.get( + '/chart', + isUserAuthenticated, + validateRequest({ + query: z.object({ + aggFn: z.nativeEnum(clickhouse.AggFn), + endTime: z.string(), + field: z.string().optional(), + granularity: z.nativeEnum(clickhouse.Granularity).optional(), + groupBy: z.string().optional(), + q: z.string().optional(), + sortOrder: z.enum(['asc', 'desc']).optional(), + startTime: z.string(), + }), + }), + async (req, res, next) => { + try { + const teamId = req.user?.team; + const { + aggFn, + endTime, + field, + granularity, + groupBy, + q, + startTime, + sortOrder, + } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + const startTimeNum = parseInt(startTime); + const endTimeNum = parseInt(endTime); + if (!isNumber(startTimeNum) || !isNumber(endTimeNum)) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + const propertyTypeMappingsModel = + await clickhouse.buildLogsPropertyTypeMappingsModel( + team.logStreamTableVersion, + teamId.toString(), + startTimeNum, + endTimeNum, + ); + + // TODO: hacky way to make sure the cache is update to date + if ( + !clickhouse.doesLogsPropertyExist(field, propertyTypeMappingsModel) || + !clickhouse.doesLogsPropertyExist(groupBy, propertyTypeMappingsModel) + ) { + logger.warn({ + message: `getChart: Property type mappings cache is out of date (${field}, ${groupBy}})`, + }); + await propertyTypeMappingsModel.refresh(); + } + + // TODO: expose this to the frontend + const MAX_NUM_GROUPS = 20; + + res.json( + await clickhouse.getLogsChart({ + aggFn, + endTime: endTimeNum, + field, + granularity, + groupBy, + maxNumGroups: MAX_NUM_GROUPS, + propertyTypeMappingsModel, + q, + sortOrder, + startTime: startTimeNum, + tableVersion: team.logStreamTableVersion, + teamId: teamId.toString(), + }), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + next(e); + } + }, +); + +router.get('/histogram', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { endTime, q, startTime } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + const startTimeNum = parseInt(startTime as string); + const endTimeNum = parseInt(endTime as string); + if (!isNumber(startTimeNum) || !isNumber(endTimeNum)) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + res.json( + await clickhouse.getHistogram( + team.logStreamTableVersion, + teamId.toString(), + q as string, + startTimeNum, + endTimeNum, + ), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + + next(e); + } +}); + +router.get('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const logId = req.params.id; + const { sortKey } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + if (!sortKey) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + res.json( + await clickhouse.getLogById( + team.logStreamTableVersion, + teamId.toString(), + sortKey as string, + logId, + ), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/metrics.ts b/packages/api/src/routers/api/metrics.ts new file mode 100644 index 00000000..982fa30a --- /dev/null +++ b/packages/api/src/routers/api/metrics.ts @@ -0,0 +1,68 @@ +import express from 'express'; +import opentelemetry, { SpanStatusCode } from '@opentelemetry/api'; +import { isNumber, parseInt } from 'lodash'; + +import * as clickhouse from '../../clickhouse'; +import { isUserAuthenticated } from '../../middleware/auth'; + +const router = express.Router(); + +router.get('/tags', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + // TODO: use cache + res.json(await clickhouse.getMetricsTags(teamId.toString())); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + next(e); + } +}); + +router.post('/chart', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { aggFn, endTime, granularity, groupBy, name, q, startTime } = + req.body; + + if (teamId == null) { + return res.sendStatus(403); + } + const startTimeNum = parseInt(startTime as string); + const endTimeNum = parseInt(endTime as string); + if (!isNumber(startTimeNum) || !isNumber(endTimeNum) || !name) { + return res.sendStatus(400); + } + + // FIXME: separate name + dataType + const [metricName, metricDataType] = (name as string).split(' - '); + if (metricName == null || metricDataType == null) { + return res.sendStatus(400); + } + + res.json( + await clickhouse.getMetricsChart({ + aggFn: aggFn as clickhouse.AggFn, + dataType: metricDataType, + endTime: endTimeNum, + granularity, + groupBy: groupBy as string, + name: metricName, + q: q as string, + startTime: startTimeNum, + teamId: teamId.toString(), + }), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/root.ts b/packages/api/src/routers/api/root.ts new file mode 100644 index 00000000..483054a2 --- /dev/null +++ b/packages/api/src/routers/api/root.ts @@ -0,0 +1,117 @@ +import express from 'express'; +import isemail from 'isemail'; +import { serializeError } from 'serialize-error'; + +import * as config from '../../config'; +import User from '../../models/user'; // TODO -> do not import model directly +import logger from '../../utils/logger'; +import passport from '../../utils/passport'; +import { Api404Error } from '../../utils/errors'; +import { isTeamExisting, createTeam, getTeam } from '../../controllers/team'; +import { validatePassword } from '../../utils/validators'; +import { + isUserAuthenticated, + redirectToDashboard, + handleAuthError, +} from '../../middleware/auth'; + +const router = express.Router(); + +router.get('/health', async (req, res) => { + res.send({ data: 'OK', version: config.CODE_VERSION, ip: req.ip }); +}); + +router.get('/me', isUserAuthenticated, async (req, res, next) => { + try { + if (req.user == null) { + throw new Api404Error('Request without user found'); + } + + const { _id: id, team: teamId, email, name, createdAt } = req.user; + + const team = await getTeam(teamId); + + return res.json({ + createdAt, + email, + id, + name, + team, + }); + } catch (e) { + next(e); + } +}); + +router.get('/installation', async (req, res, next) => { + try { + const _isTeamExisting = await isTeamExisting(); + return res.json({ + isTeamExisting: _isTeamExisting, + }); + } catch (e) { + next(e); + } +}); + +router.post( + '/login/password', + passport.authenticate('local', { + failWithError: true, + failureMessage: true, + }), + redirectToDashboard, + handleAuthError, +); + +router.post('/register/password', async (req, res, next) => { + try { + const { email, password } = req.body; + + if (!email || !password) { + return res.redirect(`${config.FRONTEND_URL}/register?err=missing`); + } + + if (!isemail.validate(email) || !validatePassword(password)) { + return res.redirect(`${config.FRONTEND_URL}/register?err=invalid`); + } + + if (await isTeamExisting()) { + return res.redirect( + `${config.FRONTEND_URL}/register?err=teamAlreadyExists`, + ); + } + + (User as any).register( + new User({ email }), + password, + async (err: Error, user: any) => { + if (err) { + logger.error(serializeError(err)); + return res.redirect(`${config.FRONTEND_URL}/register?err=invalid`); + } + + const team = await createTeam({ + name: `${email}'s Team`, + }); + user.team = team._id; + user.name = email; + await user.save(); + + return passport.authenticate('local')(req, res, () => { + redirectToDashboard(req, res); + }); + }, + ); + } catch (e) { + next(e); + } +}); + +router.get('/logout', (req, res) => { + // @ts-ignore + req.logout(); + res.redirect(`${config.FRONTEND_URL}/login`); +}); + +export default router; diff --git a/packages/api/src/routers/api/sessions.ts b/packages/api/src/routers/api/sessions.ts new file mode 100644 index 00000000..fa8a8d2f --- /dev/null +++ b/packages/api/src/routers/api/sessions.ts @@ -0,0 +1,112 @@ +import express from 'express'; +import opentelemetry, { SpanStatusCode } from '@opentelemetry/api'; +import { isNumber, parseInt } from 'lodash'; +import { serializeError } from 'serialize-error'; + +import * as clickhouse from '../../clickhouse'; +import { isUserAuthenticated } from '../../middleware/auth'; +import logger from '../../utils/logger'; +import { getTeam } from '../../controllers/team'; + +const router = express.Router(); + +router.get('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { endTime, q, startTime } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + const startTimeNum = parseInt(startTime as string); + const endTimeNum = parseInt(endTime as string); + if (!isNumber(startTimeNum) || !isNumber(endTimeNum)) { + return res.sendStatus(400); + } + + const team = await getTeam(teamId); + if (team == null) { + return res.sendStatus(403); + } + + res.json( + await clickhouse.getSessions({ + endTime: endTimeNum, + limit: 500, // fixed limit for now + offset: 0, // fixed offset for now + q: q as string, + startTime: startTimeNum, + tableVersion: team.logStreamTableVersion, + teamId: teamId.toString(), + }), + ); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + + next(e); + } +}); + +router.get('/:sessionId/rrweb', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const { sessionId } = req.params; + const { endTime, limit, offset, startTime } = req.query; + if (teamId == null) { + return res.sendStatus(403); + } + const startTimeNum = parseInt(startTime as string); + const endTimeNum = parseInt(endTime as string); + const limitNum = parseInt(limit as string); + const offsetNum = parseInt(offset as string); + if ( + !isNumber(startTimeNum) || + !isNumber(endTimeNum) || + !isNumber(limitNum) || + !isNumber(offsetNum) + ) { + return res.sendStatus(400); + } + + const MAX_LIMIT = 1e6; + + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Content-Type', 'text/event-stream'); + res.setHeader('Connection', 'keep-alive'); + res.flushHeaders(); // flush the headers to establish SSE with client + + const stream = await clickhouse.getRrwebEvents({ + sessionId: sessionId as string, + startTime: startTimeNum, + endTime: endTimeNum, + limit: Math.min(MAX_LIMIT, limitNum), + offset: offsetNum, + }); + + stream.on('data', (rows: any[]) => { + res.write(`${rows.map(row => `data: ${row.text}`).join('\n')}\n\n`); + res.flush(); + }); + stream.on('end', () => { + logger.info('Stream ended'); + + res.write('event: end\ndata:\n\n'); + res.end(); + }); + } catch (e) { + const span = opentelemetry.trace.getActiveSpan(); + span.recordException(e as Error); + span.setStatus({ code: SpanStatusCode.ERROR }); + // WARNING: no need to call next(e) here, as the stream will be closed + logger.error({ + message: 'Error while streaming rrweb events', + error: serializeError(e), + teamId: req.user?.team, + query: req.query, + }); + res.end(); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/team.ts b/packages/api/src/routers/api/team.ts new file mode 100644 index 00000000..b1b99d20 --- /dev/null +++ b/packages/api/src/routers/api/team.ts @@ -0,0 +1,187 @@ +import crypto from 'crypto'; + +import express from 'express'; +import isemail from 'isemail'; +import pick from 'lodash/pick'; +import { serializeError } from 'serialize-error'; + +import * as config from '../../config'; +import TeamInvite from '../../models/teamInvite'; +import User from '../../models/user'; +import logger from '../../utils/logger'; +import { findUserByEmail, findUsersByTeam } from '../../controllers/user'; +import { getTeam, rotateTeamApiKey } from '../../controllers/team'; +import { + isUserAuthenticated, + redirectToDashboard, +} from '../../middleware/auth'; +import { validatePassword } from '../../utils/validators'; + +const router = express.Router(); + +router.post('/', isUserAuthenticated, async (req, res, next) => { + try { + const { email: toEmail, name } = req.body; + + if (!toEmail || !isemail.validate(toEmail)) { + return res.status(400).json({ + message: 'Invalid email', + }); + } + + const teamId = req.user?.team; + const fromEmail = req.user?.email; + + if (teamId == null) { + throw new Error(`User ${req.user?._id} not associated with a team`); + } + + if (fromEmail == null) { + throw new Error(`User ${req.user?._id} doesnt have email`); + } + + const team = await getTeam(teamId); + if (team == null) { + throw new Error(`Team ${teamId} not found`); + } + + const toUser = await findUserByEmail(toEmail); + if (toUser) { + return res.status(400).json({ + message: 'User already exists. Please contact HyperDX team for support', + }); + } + + let teamInvite = await TeamInvite.findOne({ + teamId: team._id, + email: toEmail, // TODO: case insensitive ? + }); + + if (!teamInvite) { + teamInvite = await new TeamInvite({ + teamId: team._id, + name, + email: toEmail, // TODO: case insensitive ? + token: crypto.randomBytes(32).toString('hex'), + }).save(); + } + + res.json({ + url: `${config.FRONTEND_URL}/join-team?token=${teamInvite.token}`, + }); + } catch (e) { + next(e); + } +}); + +router.get('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + const userId = req.user?._id; + + if (teamId == null) { + throw new Error(`User ${req.user?._id} not associated with a team`); + } + if (userId == null) { + throw new Error(`User has no id`); + } + + const team = await getTeam(teamId); + if (team == null) { + throw new Error(`Team ${teamId} not found for user ${userId}`); + } + + const teamUsers = await findUsersByTeam(teamId); + const teamInvites = await TeamInvite.find({}); + + res.json({ + ...pick(team.toJSON(), [ + '_id', + 'allowedAuthMethods', + 'apiKey', + 'archive', + 'name', + 'slackAlert', + ]), + users: teamUsers.map(user => ({ + ...pick(user.toJSON({ virtuals: true }), [ + 'email', + 'name', + 'hasPasswordAuth', + ]), + isCurrentUser: user._id.equals(userId), + })), + teamInvites: teamInvites.map(ti => ({ + createdAt: ti.createdAt, + email: ti.email, + name: ti.name, + url: `${config.FRONTEND_URL}/join-team?token=${ti.token}`, + })), + }); + } catch (e) { + next(e); + } +}); + +router.patch('/apiKey', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + throw new Error(`User ${req.user?._id} not associated with a team`); + } + const team = await rotateTeamApiKey(teamId); + res.json({ newApiKey: team?.apiKey }); + } catch (e) { + next(e); + } +}); + +router.post('/setup/:token', async (req, res, next) => { + try { + const { password } = req.body; + const { token } = req.params; + + if (!validatePassword(password)) { + return res.redirect( + `${config.FRONTEND_URL}/join-team?err=invalid&token=${token}`, + ); + } + + const teamInvite = await TeamInvite.findOne({ + token: req.params.token, + }); + if (!teamInvite) { + return res.status(401).send('Invalid token'); + } + + (User as any).register( + new User({ + email: teamInvite.email, + name: teamInvite.email, + team: teamInvite.teamId, + }), + password, // TODO: validate password + async (err: Error, user: any) => { + if (err) { + logger.error(serializeError(err)); + return res.redirect( + `${config.FRONTEND_URL}/join-team?token=${token}&err=500`, + ); + } + + await TeamInvite.findByIdAndRemove(teamInvite._id); + + req.login(user, err => { + if (err) { + return next(err); + } + redirectToDashboard(req, res); + }); + }, + ); + } catch (e) { + next(e); + } +}); + +export default router; diff --git a/packages/api/src/routers/api/webhooks.ts b/packages/api/src/routers/api/webhooks.ts new file mode 100644 index 00000000..66447b1c --- /dev/null +++ b/packages/api/src/routers/api/webhooks.ts @@ -0,0 +1,72 @@ +import express from 'express'; + +import Webhook from '../../models/webhook'; +import { isUserAuthenticated } from '../../middleware/auth'; + +const router = express.Router(); + +router.get('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + const { service } = req.query; + const webhooks = await Webhook.find( + { team: teamId, service }, + { __v: 0, team: 0 }, + ); + res.json({ + data: webhooks, + }); + } catch (err) { + next(err); + } +}); + +router.post('/', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + const { name, service, url } = req.body; + if (!service || !url || !name) return res.sendStatus(400); + const totalWebhooks = await Webhook.countDocuments({ + team: teamId, + service, + }); + if (totalWebhooks >= 5) { + return res.status(400).json({ + message: 'You can only have 5 webhooks per team per service', + }); + } + if (await Webhook.findOne({ team: teamId, service, url })) { + return res.status(400).json({ + message: 'Webhook already exists', + }); + } + const webhook = new Webhook({ team: teamId, service, url, name }); + await webhook.save(); + res.json({ + data: webhook, + }); + } catch (err) { + next(err); + } +}); + +router.delete('/:id', isUserAuthenticated, async (req, res, next) => { + try { + const teamId = req.user?.team; + if (teamId == null) { + return res.sendStatus(403); + } + await Webhook.findOneAndDelete({ _id: req.params.id, team: teamId }); + res.json({}); + } catch (err) { + next(err); + } +}); + +export default router; diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts new file mode 100644 index 00000000..89a285b7 --- /dev/null +++ b/packages/api/src/server.ts @@ -0,0 +1,75 @@ +import http from 'http'; + +import { serializeError } from 'serialize-error'; + +import * as clickhouse from './clickhouse'; +import * as config from './config'; +import logger from './utils/logger'; +import redisClient from './utils/redis'; +import { connectDB, mongooseConnection } from './models'; + +export default class Server { + protected httpServer: http.Server; + + private async createServer() { + switch (config.APP_TYPE) { + case 'api': + return http.createServer( + (await import('./api-app').then(m => m.default)) as any, + ); + case 'aggregator': + return http.createServer( + (await import('./aggregator-app').then(m => m.default)) as any, + ); + default: + throw new Error(`Invalid APP_TYPE: ${config.APP_TYPE}`); + } + } + + async start() { + this.httpServer = await this.createServer(); + this.httpServer.keepAliveTimeout = 61000; // Ensure all inactive connections are terminated by the ALB, by setting this a few seconds higher than the ALB idle timeout + this.httpServer.headersTimeout = 62000; // Ensure the headersTimeout is set higher than the keepAliveTimeout due to this nodejs regression bug: https://github.com/nodejs/node/issues/27363 + + this.httpServer.listen(config.PORT, () => { + logger.info( + `Server listening on port ${config.PORT}, NODE_ENV=${process.env.NODE_ENV}`, + ); + }); + + await Promise.all([ + connectDB(), + redisClient.connect(), + clickhouse.connect(), + ]); + } + + // graceful shutdown + stop() { + this.httpServer.close(closeServerErr => { + if (closeServerErr) { + logger.error(serializeError(closeServerErr)); + } + logger.info('Http server closed.'); + redisClient + .disconnect() + .then(() => { + logger.info('Redis client disconnected.'); + }) + .catch((err: any) => { + logger.error(serializeError(err)); + }); + mongooseConnection.close(false, closeDBConnectionErr => { + if (closeDBConnectionErr) { + logger.error(serializeError(closeDBConnectionErr)); + } + logger.info('Mongo connection closed.'); + + if (closeServerErr || closeDBConnectionErr) { + process.exit(1); + } + process.exit(0); + }); + }); + } +} diff --git a/packages/api/src/tasks/__tests__/checkAlerts.test.ts b/packages/api/src/tasks/__tests__/checkAlerts.test.ts new file mode 100644 index 00000000..42f2f019 --- /dev/null +++ b/packages/api/src/tasks/__tests__/checkAlerts.test.ts @@ -0,0 +1,52 @@ +import { buildLogSearchLink, roundDownToXMinutes } from '../checkAlerts'; + +describe('checkAlerts', () => { + it('roundDownToXMinutes', () => { + // 1 min + const roundDownTo1Minute = roundDownToXMinutes(1); + expect( + roundDownTo1Minute(new Date('2023-03-17T22:13:03.103Z')).toISOString(), + ).toBe('2023-03-17T22:13:00.000Z'); + expect( + roundDownTo1Minute(new Date('2023-03-17T22:13:59.103Z')).toISOString(), + ).toBe('2023-03-17T22:13:00.000Z'); + + // 5 mins + const roundDownTo5Minutes = roundDownToXMinutes(5); + expect( + roundDownTo5Minutes(new Date('2023-03-17T22:13:03.103Z')).toISOString(), + ).toBe('2023-03-17T22:10:00.000Z'); + expect( + roundDownTo5Minutes(new Date('2023-03-17T22:17:59.103Z')).toISOString(), + ).toBe('2023-03-17T22:15:00.000Z'); + expect( + roundDownTo5Minutes(new Date('2023-03-17T22:59:59.103Z')).toISOString(), + ).toBe('2023-03-17T22:55:00.000Z'); + }); + + it('buildLogSearchLink', () => { + expect( + buildLogSearchLink({ + startTime: new Date('2023-03-17T22:13:03.103Z'), + endTime: new Date('2023-03-17T22:13:59.103Z'), + logView: { + _id: 123, + } as any, + }), + ).toBe( + 'http://localhost:9090/search/123?from=1679091183103&to=1679091239103', + ); + expect( + buildLogSearchLink({ + startTime: new Date('2023-03-17T22:13:03.103Z'), + endTime: new Date('2023-03-17T22:13:59.103Z'), + logView: { + _id: 123, + } as any, + q: '🐱 foo:"bar"', + }), + ).toBe( + 'http://localhost:9090/search/123?from=1679091183103&to=1679091239103&q=%F0%9F%90%B1+foo%3A%22bar%22', + ); + }); +}); diff --git a/packages/api/src/tasks/checkAlerts.ts b/packages/api/src/tasks/checkAlerts.ts new file mode 100644 index 00000000..af3eec7a --- /dev/null +++ b/packages/api/src/tasks/checkAlerts.ts @@ -0,0 +1,297 @@ +// -------------------------------------------------------- +// -------------- EXECUTE EVERY MINUTE -------------------- +// -------------------------------------------------------- +import { URLSearchParams } from 'url'; + +import * as fns from 'date-fns'; +import * as fnsTz from 'date-fns-tz'; +import ms from 'ms'; +import { serializeError } from 'serialize-error'; + +import * as clickhouse from '../clickhouse'; +import * as config from '../config'; +import * as slack from '../utils/slack'; +import Alert, { AlertState, IAlert } from '../models/alert'; +import AlertHistory, { IAlertHistory } from '../models/alertHistory'; +import LogView from '../models/logView'; +import Webhook from '../models/webhook'; +import logger from '../utils/logger'; +import { ITeam } from '../models/team'; +import { ObjectId } from '../models'; +import { truncateString } from '../utils/common'; + +import type { ResponseJSON } from '@clickhouse/client'; +import type { LogSearchRow } from '../clickhouse'; + +const MAX_MESSAGE_LENGTH = 500; + +const getLogViewEnhanced = async (logViewId: ObjectId) => { + const logView = await LogView.findById(logViewId).populate<{ + team: ITeam; + }>('team'); + if (!logView) { + throw new Error(`LogView ${logViewId} not found `); + } + return logView; +}; + +export const buildLogSearchLink = ({ + endTime, + logView, + q, + startTime, +}: { + endTime: Date; + logView: Awaited>; + q?: string; + startTime: Date; +}) => { + const url = new URL(`${config.FRONTEND_URL}/search/${logView._id}`); + const queryParams = new URLSearchParams({ + from: startTime.getTime().toString(), + to: endTime.getTime().toString(), + }); + if (q) { + queryParams.append('q', q); + } + url.search = queryParams.toString(); + return url.toString(); +}; + +const buildEventSlackMessage = ({ + alert, + endTime, + group, + logView, + results, + searchQuery, + startTime, + totalCount, +}: { + alert: IAlert; + endTime: Date; + group?: string; + logView: Awaited>; + results: ResponseJSON | undefined; + searchQuery?: string; + startTime: Date; + totalCount: number; +}) => { + const mrkdwn = [ + `*<${buildLogSearchLink({ + endTime, + logView, + q: searchQuery, + startTime, + })} | Alert for ${logView.name}>*`, + ...(group != null ? [`Group: "${group}"`] : []), + `${totalCount} lines found, expected ${ + alert.type === 'presence' ? 'less than' : 'greater than' + } ${alert.threshold} lines`, + ...(results?.rows != null && totalCount > 0 + ? [ + `\`\`\``, + truncateString( + results.data + .map(row => { + return `${fnsTz.formatInTimeZone( + new Date(row.timestamp), + 'Etc/UTC', + 'MMM d HH:mm:ss', + )}Z [${row.severity_text}] ${truncateString( + row.body, + MAX_MESSAGE_LENGTH, + )}`; + }) + .join('\n'), + 2500, + ), + `\`\`\``, + ] + : []), + ].join('\n'); + + return { + text: `Alert for ${logView.name} - ${totalCount} lines found`, + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: mrkdwn, + }, + }, + ], + }; +}; + +const fireChannelEvent = async ({ + alert, + logView, + totalCount, + group, + startTime, + endTime, +}: { + alert: IAlert; + logView: Awaited>; + totalCount: number; + group?: string; + startTime: Date; + endTime: Date; +}) => { + const searchQuery = alert.groupBy + ? `${logView.query} ${alert.groupBy}:"${group}"` + : logView.query; + // TODO: show group + total count for group-by alerts + const results = await clickhouse.getLogBatch({ + endTime: endTime.getTime(), + limit: 5, + offset: 0, + order: 'desc', // TODO: better to use null + q: searchQuery, + startTime: startTime.getTime(), + tableVersion: logView.team.logStreamTableVersion, + teamId: logView.team._id.toString(), + }); + + switch (alert.channel.type) { + case 'webhook': { + const webhook = await Webhook.findOne({ + _id: alert.channel.webhookId, + }); + // ONLY SUPPORTS SLACK WEBHOOKS FOR NOW + if (webhook.service === 'slack') { + await slack.postMessageToWebhook( + webhook.url, + buildEventSlackMessage({ + alert, + endTime, + group, + logView, + results, + searchQuery, + startTime, + totalCount, + }), + ); + } + break; + } + default: + throw new Error( + `Unsupported channel type: ${(alert.channel as any).any}`, + ); + } +}; + +const doesExceedThreshold = (alert: IAlert, totalCount: number) => { + if (alert.type === 'presence' && totalCount >= alert.threshold) { + return true; + } else if (alert.type === 'absence' && totalCount < alert.threshold) { + return true; + } + return false; +}; + +export const roundDownTo = (roundTo: number) => (x: Date) => + new Date(Math.floor(x.getTime() / roundTo) * roundTo); +export const roundDownToXMinutes = (x: number) => roundDownTo(1000 * 60 * x); + +const processAlert = async (now: Date, alert: IAlert) => { + try { + const logView = await getLogViewEnhanced(alert.logView); + + const previous: IAlertHistory | undefined = ( + await AlertHistory.find({ alert: alert._id }) + .sort({ createdAt: -1 }) + .limit(1) + )[0]; + + const windowSizeInMins = ms(alert.interval) / 60000; + const nowInMinsRoundDown = roundDownToXMinutes(windowSizeInMins)(now); + if ( + previous && + fns.getTime(previous.createdAt) === fns.getTime(nowInMinsRoundDown) + ) { + logger.info({ + message: `Skipped to check alert since the time diff is still less than 1 window size`, + windowSizeInMins, + nowInMinsRoundDown, + previous, + now, + alert, + logView, + }); + return; + } + const history = await new AlertHistory({ + alert: alert._id, + createdAt: nowInMinsRoundDown, + }).save(); + const checkStartTime = previous + ? previous.createdAt + : fns.subMinutes(nowInMinsRoundDown, windowSizeInMins); + const checkEndTime = nowInMinsRoundDown; + const check = await clickhouse.checkAlert({ + endTime: checkEndTime, + groupBy: alert.groupBy, + q: logView.query, + startTime: checkStartTime, + tableVersion: logView.team.logStreamTableVersion, + teamId: logView.team._id.toString(), + windowSizeInMins, + }); + + logger.info({ + message: 'Received alert metric', + alert, + logView, + check, + checkStartTime, + checkEndTime, + }); + + // TODO: support INSUFFICIENT_DATA state + let alertState = AlertState.OK; + if (check?.rows && check?.rows > 0) { + for (const checkData of check.data) { + const totalCount = parseInt(checkData.count); + if (doesExceedThreshold(alert, totalCount)) { + alertState = AlertState.ALERT; + logger.info({ + message: `Triggering ${alert.channel.type} alarm!`, + alert, + logView, + totalCount, + checkData, + }); + const bucketStart = new Date(checkData.ts_bucket); + await fireChannelEvent({ + alert, + logView, + totalCount, + group: checkData.group, + startTime: bucketStart, + endTime: fns.addMinutes(bucketStart, windowSizeInMins), + }); + history.counts += 1; + } + } + await history.save(); + } + alert.state = alertState; + await (alert as any).save(); + } catch (e) { + // Uncomment this for better error messages locally + // console.error(e); + logger.error(serializeError(e)); + } +}; + +export default async () => { + const now = new Date(); + const alerts = await Alert.find({}); + logger.info(`Going to process ${alerts.length} alerts`); + await Promise.all(alerts.map(alert => processAlert(now, alert))); +}; diff --git a/packages/api/src/tasks/index.ts b/packages/api/src/tasks/index.ts new file mode 100644 index 00000000..93716c0f --- /dev/null +++ b/packages/api/src/tasks/index.ts @@ -0,0 +1,84 @@ +import { performance } from 'perf_hooks'; + +import minimist from 'minimist'; +import schedule from 'node-schedule'; +import { serializeError } from 'serialize-error'; + +import checkAlerts from './checkAlerts'; +import logger from '../utils/logger'; +import redisClient from '../utils/redis'; +import refreshPropertyTypeMappings from './refreshPropertyTypeMappings'; +import { IS_DEV } from '../config'; +import { connectDB, mongooseConnection } from '../models'; + +const main = async () => { + const argv = minimist(process.argv.slice(2)); + const taskName = argv._[0]; + + // connect dbs + redis + await Promise.all([connectDB(), redisClient.connect()]); + + const t0 = performance.now(); + logger.info(`Task [${taskName}] started at ${new Date()}`); + switch (taskName) { + case 'check-alerts': + await checkAlerts(); + break; + case 'refresh-property-type-mappings': + await refreshPropertyTypeMappings(); + break; + // only for testing + case 'ping-pong': + logger.info(` + O . + _/|\\_-O + ___|_______ + / | \ + / | \ + ################# + / _ ( )| \ + / ( ) || \ + / \\ |_/ | \ + /____\\/|___|___________\ + | | | + | / \\ | + | / \\ | + |_/ /_ + `); + break; + default: + throw new Error(`Unkown task name ${taskName}`); + } + logger.info( + `Task [${taskName}] finished in ${(performance.now() - t0).toFixed(2)} ms`, + ); + + // close redis + db connections + await Promise.all([redisClient.disconnect(), mongooseConnection.close()]); +}; + +if (IS_DEV) { + schedule.scheduleJob('*/1 * * * *', main); +} else { + main() + .then(() => { + process.exit(0); + }) + .catch(err => { + console.log(err); + logger.error(serializeError(err)); + process.exit(1); + }); +} + +process.on('uncaughtException', (err: Error) => { + console.log(err); + logger.error(serializeError(err)); + process.exit(1); +}); + +process.on('unhandledRejection', (err: Error) => { + console.log(err); + logger.error(serializeError(err)); + process.exit(1); +}); diff --git a/packages/api/src/tasks/refreshPropertyTypeMappings.ts b/packages/api/src/tasks/refreshPropertyTypeMappings.ts new file mode 100644 index 00000000..4e54d667 --- /dev/null +++ b/packages/api/src/tasks/refreshPropertyTypeMappings.ts @@ -0,0 +1,42 @@ +// -------------------------------------------------------- +// ------------------ EXECUTE HOURLY ---------------------- +// -------------------------------------------------------- +import ms from 'ms'; + +import * as clickhouse from '../clickhouse'; +import Team from '../models/team'; +import logger from '../utils/logger'; +import { LogsPropertyTypeMappingsModel } from '../clickhouse/propertyTypeMappingsModel'; + +const MAX_PROCESS_TEAMS = 30; +const LOG_PREFIX = '[refreshPropertyTypeMappings]'; + +export default async () => { + const nowInMs = Date.now(); + const teams = await Team.find({}); + let c = 0; + const promises = []; + for (const team of teams) { + if (c >= MAX_PROCESS_TEAMS) { + logger.info(`${LOG_PREFIX} Processed ${c} teams, exiting...`); + break; + } + const teamId = team._id.toString(); + const model = new LogsPropertyTypeMappingsModel( + team.logStreamTableVersion, + teamId, + clickhouse.fetchLogsPropertyTypeMappings(nowInMs - ms('3d'), nowInMs), + ); + const isAboutToExpire = await model.isAboutToExpire(); + if (isAboutToExpire) { + logger.info(`${LOG_PREFIX} Refreshing team ${teamId}`); + promises.push(model._refresh({ incrementalUpdate: false })); + c += 1; + } else { + logger.info(`${LOG_PREFIX} Skipping team ${teamId}`); + } + } + + await Promise.all(promises); + logger.info(`${LOG_PREFIX} Refreshed ${c} teams`); +}; diff --git a/packages/api/src/utils/__tests__/__snapshots__/logParser.test.ts.snap b/packages/api/src/utils/__tests__/__snapshots__/logParser.test.ts.snap new file mode 100644 index 00000000..1add8294 --- /dev/null +++ b/packages/api/src/utils/__tests__/__snapshots__/logParser.test.ts.snap @@ -0,0 +1,2093 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`logParser mapObjectToKeyValuePairs 1`] = ` +Object { + "bool.names": Array [ + "foo2", + "good.burrito.is", + ], + "bool.values": Array [ + 0, + 1, + ], + "number.names": Array [ + "foo1", + ], + "number.values": Array [ + 123, + ], + "string.names": Array [ + "foo", + "nested.foo", + "array1", + "array2", + ], + "string.values": Array [ + "123", + "bar", + "[456]", + "[\\"foo1\\",{\\"foo2\\":\\"bar2\\"},[{\\"foo3\\":\\"bar3\\"}]]", + ], +} +`; + +exports[`logParser mapObjectToKeyValuePairs 2`] = ` +Object { + "bool.names": Array [], + "bool.values": Array [], + "number.names": Array [ + "foo0", + "foo1", + "foo2", + "foo3", + "foo4", + "foo5", + "foo6", + "foo7", + "foo8", + "foo9", + "foo10", + "foo11", + "foo12", + "foo13", + "foo14", + "foo15", + "foo16", + "foo17", + "foo18", + "foo19", + "foo20", + "foo21", + "foo22", + "foo23", + "foo24", + "foo25", + "foo26", + "foo27", + "foo28", + "foo29", + "foo30", + "foo31", + "foo32", + "foo33", + "foo34", + "foo35", + "foo36", + "foo37", + "foo38", + "foo39", + "foo40", + "foo41", + "foo42", + "foo43", + "foo44", + "foo45", + "foo46", + "foo47", + "foo48", + "foo49", + "foo50", + "foo51", + "foo52", + "foo53", + "foo54", + "foo55", + "foo56", + "foo57", + "foo58", + "foo59", + "foo60", + "foo61", + "foo62", + "foo63", + "foo64", + "foo65", + "foo66", + "foo67", + "foo68", + "foo69", + "foo70", + "foo71", + "foo72", + "foo73", + "foo74", + "foo75", + "foo76", + "foo77", + "foo78", + "foo79", + "foo80", + "foo81", + "foo82", + "foo83", + "foo84", + "foo85", + "foo86", + "foo87", + "foo88", + "foo89", + "foo90", + "foo91", + "foo92", + "foo93", + "foo94", + "foo95", + "foo96", + "foo97", + "foo98", + "foo99", + "foo100", + "foo101", + "foo102", + "foo103", + "foo104", + "foo105", + "foo106", + "foo107", + "foo108", + "foo109", + "foo110", + "foo111", + "foo112", + "foo113", + "foo114", + "foo115", + "foo116", + "foo117", + "foo118", + "foo119", + "foo120", + "foo121", + "foo122", + "foo123", + "foo124", + "foo125", + "foo126", + "foo127", + "foo128", + "foo129", + "foo130", + "foo131", + "foo132", + "foo133", + "foo134", + "foo135", + "foo136", + "foo137", + "foo138", + "foo139", + "foo140", + "foo141", + "foo142", + "foo143", + "foo144", + "foo145", + "foo146", + "foo147", + "foo148", + "foo149", + "foo150", + "foo151", + "foo152", + "foo153", + "foo154", + "foo155", + "foo156", + "foo157", + "foo158", + "foo159", + "foo160", + "foo161", + "foo162", + "foo163", + "foo164", + "foo165", + "foo166", + "foo167", + "foo168", + "foo169", + "foo170", + "foo171", + "foo172", + "foo173", + "foo174", + "foo175", + "foo176", + "foo177", + "foo178", + "foo179", + "foo180", + "foo181", + "foo182", + "foo183", + "foo184", + "foo185", + "foo186", + "foo187", + "foo188", + "foo189", + "foo190", + "foo191", + "foo192", + "foo193", + "foo194", + "foo195", + "foo196", + "foo197", + "foo198", + "foo199", + "foo200", + "foo201", + "foo202", + "foo203", + "foo204", + "foo205", + "foo206", + "foo207", + "foo208", + "foo209", + "foo210", + "foo211", + "foo212", + "foo213", + "foo214", + "foo215", + "foo216", + "foo217", + "foo218", + "foo219", + "foo220", + "foo221", + "foo222", + "foo223", + "foo224", + "foo225", + "foo226", + "foo227", + "foo228", + "foo229", + "foo230", + "foo231", + "foo232", + "foo233", + "foo234", + "foo235", + "foo236", + "foo237", + "foo238", + "foo239", + "foo240", + "foo241", + "foo242", + "foo243", + "foo244", + "foo245", + "foo246", + "foo247", + "foo248", + "foo249", + "foo250", + "foo251", + "foo252", + "foo253", + "foo254", + "foo255", + "foo256", + "foo257", + "foo258", + "foo259", + "foo260", + "foo261", + "foo262", + "foo263", + "foo264", + "foo265", + "foo266", + "foo267", + "foo268", + "foo269", + "foo270", + "foo271", + "foo272", + "foo273", + "foo274", + "foo275", + "foo276", + "foo277", + "foo278", + "foo279", + "foo280", + "foo281", + "foo282", + "foo283", + "foo284", + "foo285", + "foo286", + "foo287", + "foo288", + "foo289", + "foo290", + "foo291", + "foo292", + "foo293", + "foo294", + "foo295", + "foo296", + "foo297", + "foo298", + "foo299", + "foo300", + "foo301", + "foo302", + "foo303", + "foo304", + "foo305", + "foo306", + "foo307", + "foo308", + "foo309", + "foo310", + "foo311", + "foo312", + "foo313", + "foo314", + "foo315", + "foo316", + "foo317", + "foo318", + "foo319", + "foo320", + "foo321", + "foo322", + "foo323", + "foo324", + "foo325", + "foo326", + "foo327", + "foo328", + "foo329", + "foo330", + "foo331", + "foo332", + "foo333", + "foo334", + "foo335", + "foo336", + "foo337", + "foo338", + "foo339", + "foo340", + "foo341", + "foo342", + "foo343", + "foo344", + "foo345", + "foo346", + "foo347", + "foo348", + "foo349", + "foo350", + "foo351", + "foo352", + "foo353", + "foo354", + "foo355", + "foo356", + "foo357", + "foo358", + "foo359", + "foo360", + "foo361", + "foo362", + "foo363", + "foo364", + "foo365", + "foo366", + "foo367", + "foo368", + "foo369", + "foo370", + "foo371", + "foo372", + "foo373", + "foo374", + "foo375", + "foo376", + "foo377", + "foo378", + "foo379", + "foo380", + "foo381", + "foo382", + "foo383", + "foo384", + "foo385", + "foo386", + "foo387", + "foo388", + "foo389", + "foo390", + "foo391", + "foo392", + "foo393", + "foo394", + "foo395", + "foo396", + "foo397", + "foo398", + "foo399", + "foo400", + "foo401", + "foo402", + "foo403", + "foo404", + "foo405", + "foo406", + "foo407", + "foo408", + "foo409", + "foo410", + "foo411", + "foo412", + "foo413", + "foo414", + "foo415", + "foo416", + "foo417", + "foo418", + "foo419", + "foo420", + "foo421", + "foo422", + "foo423", + "foo424", + "foo425", + "foo426", + "foo427", + "foo428", + "foo429", + "foo430", + "foo431", + "foo432", + "foo433", + "foo434", + "foo435", + "foo436", + "foo437", + "foo438", + "foo439", + "foo440", + "foo441", + "foo442", + "foo443", + "foo444", + "foo445", + "foo446", + "foo447", + "foo448", + "foo449", + "foo450", + "foo451", + "foo452", + "foo453", + "foo454", + "foo455", + "foo456", + "foo457", + "foo458", + "foo459", + "foo460", + "foo461", + "foo462", + "foo463", + "foo464", + "foo465", + "foo466", + "foo467", + "foo468", + "foo469", + "foo470", + "foo471", + "foo472", + "foo473", + "foo474", + "foo475", + "foo476", + "foo477", + "foo478", + "foo479", + "foo480", + "foo481", + "foo482", + "foo483", + "foo484", + "foo485", + "foo486", + "foo487", + "foo488", + "foo489", + "foo490", + "foo491", + "foo492", + "foo493", + "foo494", + "foo495", + "foo496", + "foo497", + "foo498", + "foo499", + "foo500", + "foo501", + "foo502", + "foo503", + "foo504", + "foo505", + "foo506", + "foo507", + "foo508", + "foo509", + "foo510", + "foo511", + "foo512", + "foo513", + "foo514", + "foo515", + "foo516", + "foo517", + "foo518", + "foo519", + "foo520", + "foo521", + "foo522", + "foo523", + "foo524", + "foo525", + "foo526", + "foo527", + "foo528", + "foo529", + "foo530", + "foo531", + "foo532", + "foo533", + "foo534", + "foo535", + "foo536", + "foo537", + "foo538", + "foo539", + "foo540", + "foo541", + "foo542", + "foo543", + "foo544", + "foo545", + "foo546", + "foo547", + "foo548", + "foo549", + "foo550", + "foo551", + "foo552", + "foo553", + "foo554", + "foo555", + "foo556", + "foo557", + "foo558", + "foo559", + "foo560", + "foo561", + "foo562", + "foo563", + "foo564", + "foo565", + "foo566", + "foo567", + "foo568", + "foo569", + "foo570", + "foo571", + "foo572", + "foo573", + "foo574", + "foo575", + "foo576", + "foo577", + "foo578", + "foo579", + "foo580", + "foo581", + "foo582", + "foo583", + "foo584", + "foo585", + "foo586", + "foo587", + "foo588", + "foo589", + "foo590", + "foo591", + "foo592", + "foo593", + "foo594", + "foo595", + "foo596", + "foo597", + "foo598", + "foo599", + "foo600", + "foo601", + "foo602", + "foo603", + "foo604", + "foo605", + "foo606", + "foo607", + "foo608", + "foo609", + "foo610", + "foo611", + "foo612", + "foo613", + "foo614", + "foo615", + "foo616", + "foo617", + "foo618", + "foo619", + "foo620", + "foo621", + "foo622", + "foo623", + "foo624", + "foo625", + "foo626", + "foo627", + "foo628", + "foo629", + "foo630", + "foo631", + "foo632", + "foo633", + "foo634", + "foo635", + "foo636", + "foo637", + "foo638", + "foo639", + "foo640", + "foo641", + "foo642", + "foo643", + "foo644", + "foo645", + "foo646", + "foo647", + "foo648", + "foo649", + "foo650", + "foo651", + "foo652", + "foo653", + "foo654", + "foo655", + "foo656", + "foo657", + "foo658", + "foo659", + "foo660", + "foo661", + "foo662", + "foo663", + "foo664", + "foo665", + "foo666", + "foo667", + "foo668", + "foo669", + "foo670", + "foo671", + "foo672", + "foo673", + "foo674", + "foo675", + "foo676", + "foo677", + "foo678", + "foo679", + "foo680", + "foo681", + "foo682", + "foo683", + "foo684", + "foo685", + "foo686", + "foo687", + "foo688", + "foo689", + "foo690", + "foo691", + "foo692", + "foo693", + "foo694", + "foo695", + "foo696", + "foo697", + "foo698", + "foo699", + "foo700", + "foo701", + "foo702", + "foo703", + "foo704", + "foo705", + "foo706", + "foo707", + "foo708", + "foo709", + "foo710", + "foo711", + "foo712", + "foo713", + "foo714", + "foo715", + "foo716", + "foo717", + "foo718", + "foo719", + "foo720", + "foo721", + "foo722", + "foo723", + "foo724", + "foo725", + "foo726", + "foo727", + "foo728", + "foo729", + "foo730", + "foo731", + "foo732", + "foo733", + "foo734", + "foo735", + "foo736", + "foo737", + "foo738", + "foo739", + "foo740", + "foo741", + "foo742", + "foo743", + "foo744", + "foo745", + "foo746", + "foo747", + "foo748", + "foo749", + "foo750", + "foo751", + "foo752", + "foo753", + "foo754", + "foo755", + "foo756", + "foo757", + "foo758", + "foo759", + "foo760", + "foo761", + "foo762", + "foo763", + "foo764", + "foo765", + "foo766", + "foo767", + "foo768", + "foo769", + "foo770", + "foo771", + "foo772", + "foo773", + "foo774", + "foo775", + "foo776", + "foo777", + "foo778", + "foo779", + "foo780", + "foo781", + "foo782", + "foo783", + "foo784", + "foo785", + "foo786", + "foo787", + "foo788", + "foo789", + "foo790", + "foo791", + "foo792", + "foo793", + "foo794", + "foo795", + "foo796", + "foo797", + "foo798", + "foo799", + "foo800", + "foo801", + "foo802", + "foo803", + "foo804", + "foo805", + "foo806", + "foo807", + "foo808", + "foo809", + "foo810", + "foo811", + "foo812", + "foo813", + "foo814", + "foo815", + "foo816", + "foo817", + "foo818", + "foo819", + "foo820", + "foo821", + "foo822", + "foo823", + "foo824", + "foo825", + "foo826", + "foo827", + "foo828", + "foo829", + "foo830", + "foo831", + "foo832", + "foo833", + "foo834", + "foo835", + "foo836", + "foo837", + "foo838", + "foo839", + "foo840", + "foo841", + "foo842", + "foo843", + "foo844", + "foo845", + "foo846", + "foo847", + "foo848", + "foo849", + "foo850", + "foo851", + "foo852", + "foo853", + "foo854", + "foo855", + "foo856", + "foo857", + "foo858", + "foo859", + "foo860", + "foo861", + "foo862", + "foo863", + "foo864", + "foo865", + "foo866", + "foo867", + "foo868", + "foo869", + "foo870", + "foo871", + "foo872", + "foo873", + "foo874", + "foo875", + "foo876", + "foo877", + "foo878", + "foo879", + "foo880", + "foo881", + "foo882", + "foo883", + "foo884", + "foo885", + "foo886", + "foo887", + "foo888", + "foo889", + "foo890", + "foo891", + "foo892", + "foo893", + "foo894", + "foo895", + "foo896", + "foo897", + "foo898", + "foo899", + "foo900", + "foo901", + "foo902", + "foo903", + "foo904", + "foo905", + "foo906", + "foo907", + "foo908", + "foo909", + "foo910", + "foo911", + "foo912", + "foo913", + "foo914", + "foo915", + "foo916", + "foo917", + "foo918", + "foo919", + "foo920", + "foo921", + "foo922", + "foo923", + "foo924", + "foo925", + "foo926", + "foo927", + "foo928", + "foo929", + "foo930", + "foo931", + "foo932", + "foo933", + "foo934", + "foo935", + "foo936", + "foo937", + "foo938", + "foo939", + "foo940", + "foo941", + "foo942", + "foo943", + "foo944", + "foo945", + "foo946", + "foo947", + "foo948", + "foo949", + "foo950", + "foo951", + "foo952", + "foo953", + "foo954", + "foo955", + "foo956", + "foo957", + "foo958", + "foo959", + "foo960", + "foo961", + "foo962", + "foo963", + "foo964", + "foo965", + "foo966", + "foo967", + "foo968", + "foo969", + "foo970", + "foo971", + "foo972", + "foo973", + "foo974", + "foo975", + "foo976", + "foo977", + "foo978", + "foo979", + "foo980", + "foo981", + "foo982", + "foo983", + "foo984", + "foo985", + "foo986", + "foo987", + "foo988", + "foo989", + "foo990", + "foo991", + "foo992", + "foo993", + "foo994", + "foo995", + "foo996", + "foo997", + "foo998", + "foo999", + "foo1000", + "foo1001", + "foo1002", + "foo1003", + "foo1004", + "foo1005", + "foo1006", + "foo1007", + "foo1008", + "foo1009", + "foo1010", + "foo1011", + "foo1012", + "foo1013", + "foo1014", + "foo1015", + "foo1016", + "foo1017", + "foo1018", + "foo1019", + "foo1020", + "foo1021", + "foo1022", + "foo1023", + ], + "number.values": Array [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + ], + "string.names": Array [], + "string.values": Array [], +} +`; diff --git a/packages/api/src/utils/__tests__/errors.test.ts b/packages/api/src/utils/__tests__/errors.test.ts new file mode 100644 index 00000000..1d6b15c6 --- /dev/null +++ b/packages/api/src/utils/__tests__/errors.test.ts @@ -0,0 +1,21 @@ +import { Api500Error, BaseError, isOperationalError } from '../errors'; + +describe('Errors utils', () => { + test('BaseError class', () => { + const e = new BaseError('nvim', 500, true, 'is the best editor!!!'); + expect(e.name).toBe('nvim'); + expect(e.statusCode).toBe(500); + expect(e.isOperational).toBeTruthy(); + expect(e.message).toBe('is the best editor!!!'); + expect(e.stack?.includes('nvim: is the best editor')); + }); + + test('isOperational', () => { + expect( + isOperationalError( + new BaseError('nvim', 500, true, 'is the best editor!!!'), + ), + ).toBeTruthy(); + expect(isOperationalError(new Api500Error('BANG'))).toBeTruthy(); + }); +}); diff --git a/packages/api/src/utils/__tests__/logParser.test.ts b/packages/api/src/utils/__tests__/logParser.test.ts new file mode 100644 index 00000000..29ad5bf9 --- /dev/null +++ b/packages/api/src/utils/__tests__/logParser.test.ts @@ -0,0 +1,121 @@ +import { mapObjectToKeyValuePairs, traverseJson } from '../logParser'; + +describe('logParser', () => { + it('traverseJson', () => { + const jsonIt = traverseJson({ + foo: { + bar: 'bar', + foo1: { + foo1: 'bar1', + foo2: { + bar2: 'bar2', + }, + }, + }, + }); + const keys = []; + const values = []; + for (const [key, value] of jsonIt) { + keys.push(key); + values.push(value); + } + + expect(keys).toEqual([ + ['foo'], + ['foo', 'bar'], + ['foo', 'foo1'], + ['foo', 'foo1', 'foo1'], + ['foo', 'foo1', 'foo2'], + ['foo', 'foo1', 'foo2', 'bar2'], + ]); + expect(values).toEqual([ + { + bar: 'bar', + foo1: { + foo1: 'bar1', + foo2: { + bar2: 'bar2', + }, + }, + }, + 'bar', + { + foo1: 'bar1', + foo2: { + bar2: 'bar2', + }, + }, + 'bar1', + { + bar2: 'bar2', + }, + 'bar2', + ]); + }); + + it('mapObjectToKeyValuePairs', () => { + expect(mapObjectToKeyValuePairs(null as any)).toEqual({ + 'bool.names': [], + 'bool.values': [], + 'number.names': [], + 'number.values': [], + 'string.names': [], + 'string.values': [], + }); + + expect(mapObjectToKeyValuePairs({})).toEqual({ + 'bool.names': [], + 'bool.values': [], + 'number.names': [], + 'number.values': [], + 'string.names': [], + 'string.values': [], + }); + + expect( + mapObjectToKeyValuePairs({ foo: '123', foo1: 123, foo2: false }), + ).toEqual({ + 'bool.names': ['foo2'], + 'bool.values': [0], + 'number.names': ['foo1'], + 'number.values': [123], + 'string.names': ['foo'], + 'string.values': ['123'], + }); + + expect( + mapObjectToKeyValuePairs({ + foo: '123', + foo1: 123, + foo2: false, + nested: { foo: 'bar' }, + good: { + burrito: { + is: true, + }, + }, + array1: [456], + array2: [ + 'foo1', + { + foo2: 'bar2', + }, + [ + { + foo3: 'bar3', + }, + ], + ], + }), + ).toMatchSnapshot(); + + const testObject = {}; + for (let i = 0; i < 2000; i++) { + testObject[`foo${i}`] = i; + } + const result = mapObjectToKeyValuePairs(testObject); + expect(result['number.names'].length).toEqual(1024); + expect(result['number.values'].length).toEqual(1024); + expect(result).toMatchSnapshot(); + }); +}); diff --git a/packages/api/src/utils/__tests__/validators.test.ts b/packages/api/src/utils/__tests__/validators.test.ts new file mode 100644 index 00000000..c31dc1bd --- /dev/null +++ b/packages/api/src/utils/__tests__/validators.test.ts @@ -0,0 +1,17 @@ +import * as validators from '../validators'; + +describe('validators', () => { + describe('validatePassword', () => { + it('should return true if password is valid', () => { + expect(validators.validatePassword('abcdefgh')).toBe(true); + }); + + it('should return false if password is invalid', () => { + expect(validators.validatePassword(null)).toBe(false); + expect(validators.validatePassword(undefined)).toBe(false); + expect(validators.validatePassword('')).toBe(false); + expect(validators.validatePassword('1234567')).toBe(false); + expect(validators.validatePassword('a'.repeat(65))).toBe(false); + }); + }); +}); diff --git a/packages/api/src/utils/common.ts b/packages/api/src/utils/common.ts new file mode 100644 index 00000000..5a8eaeac --- /dev/null +++ b/packages/api/src/utils/common.ts @@ -0,0 +1,28 @@ +export const useTry = (fn: () => T): [null | Error | unknown, null | T] => { + let output = null; + let error = null; + try { + output = fn(); + return [error, output]; + } catch (e) { + error = e; + return [error, output]; + } +}; + +export const tryJSONStringify = ( + json: Record | Record[], +) => { + const [_, result] = useTry(() => JSON.stringify(json)); + return result; +}; + +export const truncateString = (str: string, length: number) => { + if (str.length > length) { + return str.substring(0, length) + '...'; + } + return str; +}; + +export const sleep = (ms: number) => + new Promise(resolve => setTimeout(resolve, ms)); diff --git a/packages/api/src/utils/email.ts b/packages/api/src/utils/email.ts new file mode 100644 index 00000000..6227f24d --- /dev/null +++ b/packages/api/src/utils/email.ts @@ -0,0 +1,27 @@ +export const sendAlert = ({ + alertDetails, + alertEvents, + alertGroup, + alertName, + alertUrl, + toEmail, +}: { + alertDetails: string; + alertEvents: string; + alertGroup?: string; + alertName: string; + alertUrl: string; + toEmail: string; +}) => { + // Send alert email +}; + +export const sendResetPasswordEmail = ({ + toEmail, + token, +}: { + toEmail: string; + token: string; +}) => { + // Send reset password email +}; diff --git a/packages/api/src/utils/errors.ts b/packages/api/src/utils/errors.ts new file mode 100644 index 00000000..148f6304 --- /dev/null +++ b/packages/api/src/utils/errors.ts @@ -0,0 +1,56 @@ +export enum StatusCode { + OK = 200, + BAD_REQUEST = 400, + UNAUTHORIZED = 401, + FORBIDDEN = 403, + NOT_FOUND = 404, + INTERNAL_SERVER = 500, +} + +export class BaseError extends Error { + name: string; + + statusCode: StatusCode; + + isOperational: boolean; + + constructor( + name: string, + statusCode: StatusCode, + isOperational: boolean, + description: string, + ) { + super(description); + + Object.setPrototypeOf(this, BaseError.prototype); + + this.name = name; + this.statusCode = statusCode; + this.isOperational = isOperational; + } +} + +export class Api500Error extends BaseError { + constructor(name: string) { + super(name, StatusCode.INTERNAL_SERVER, true, 'Internal Server Error'); + } +} + +export class Api400Error extends BaseError { + constructor(name: string) { + super(name, StatusCode.BAD_REQUEST, true, 'Bad Request'); + } +} + +export class Api404Error extends BaseError { + constructor(name: string) { + super(name, StatusCode.NOT_FOUND, true, 'Not Found'); + } +} + +export const isOperationalError = (error: Error) => { + if (error instanceof BaseError) { + return error.isOperational; + } + return false; +}; diff --git a/packages/api/src/utils/logParser.ts b/packages/api/src/utils/logParser.ts new file mode 100644 index 00000000..6c60ddab --- /dev/null +++ b/packages/api/src/utils/logParser.ts @@ -0,0 +1,307 @@ +import _ from 'lodash'; + +import { tryJSONStringify } from './common'; + +export type JSONBlob = Record; + +export type KeyPath = string[]; + +export enum LogType { + Log = 'log', + Metric = 'metric', + Span = 'span', +} + +export enum LogPlatform { + Docker = 'docker', + Heroku = 'heroku', + HyperDX = 'hyperdx', + NodeJS = 'nodejs', + OtelLogs = 'otel-logs', + OtelTraces = 'otel-traces', + OtelMetrics = 'otel-metrics', + Rrweb = 'rrweb', +} + +export type KeyValuePairs = { + 'bool.names': string[]; + 'bool.values': number[]; + 'number.names': string[]; + 'number.values': number[]; + 'string.names': string[]; + 'string.values': string[]; +}; + +export type SpanFields = { + end_timestamp?: number; + span_name?: string; + parent_span_id?: string; +}; + +export type LogFields = { + _host?: string; + severity_number?: number; + severity_text?: string; +}; + +export type RrwebEventModel = KeyValuePairs & { + _service?: string; + _source: string; + timestamp: number; +}; + +export type LogStreamModel = KeyValuePairs & + LogFields & + SpanFields & { + _namespace?: string; + _platform: LogPlatform; + _service?: string; + _source: string; // raw log + observed_timestamp: number; + span_id?: string; + timestamp: number; + trace_id?: string; + type: LogType; + }; + +export type MetricModel = { + _string_attributes: Record; + data_type: string; + name: string; + timestamp: number; + value: number; +}; + +const MAX_DEPTH = 6; +export function* traverseJson( + currentNode: JSONBlob, + depth = 1, + keyPathArray?: KeyPath, +): IterableIterator<[KeyPath, any]> { + for (const [key, value] of Object.entries(currentNode)) { + const keyPath = keyPathArray ? [...keyPathArray, key] : [key]; + + yield [keyPath, value]; + + if (_.isObject(value) && Object.keys(value).length && depth < MAX_DEPTH) { + // TODO: limit array length ?? + if (_.isArray(value)) { + yield [keyPath, tryJSONStringify(value)]; + } else { + yield* traverseJson(value, depth + 1, keyPath); + } + } + // TODO: alert if MAX_DEPTH is reached + } +} + +const MAX_KEY_VALUE_PAIRS_LENGTH = 1024; +export const mapObjectToKeyValuePairs = ( + blob: JSONBlob, + maxArrayLength = MAX_KEY_VALUE_PAIRS_LENGTH, +): KeyValuePairs => { + const output: KeyValuePairs = { + 'bool.names': [], + 'bool.values': [], + 'number.names': [], + 'number.values': [], + 'string.names': [], + 'string.values': [], + }; + const pushArray = ( + type: 'bool' | 'number' | 'string', + keyPath: string, + value: any, + ) => { + const keyNames = `${type}.names`; + const keyValues = `${type}.values`; + if (output[keyNames].length < maxArrayLength) { + output[keyNames].push(keyPath); + output[keyValues].push(value); + return true; + } + return false; + }; + + let reachedBoolMaxLength = false; + let reachedNumberMaxLength = false; + let reachedStringMaxLength = false; + + if (_.isPlainObject(blob)) { + const jsonIt = traverseJson(blob); + let pushed = true; + for (const [key, value] of jsonIt) { + const compoundKeyPath = key.join('.'); + if (!reachedNumberMaxLength && _.isNumber(value)) { + pushed = pushArray('number', compoundKeyPath, value); + if (!pushed) { + reachedNumberMaxLength = true; + } + } else if (!reachedBoolMaxLength && _.isBoolean(value)) { + pushed = pushArray('bool', compoundKeyPath, value ? 1 : 0); + if (!pushed) { + reachedBoolMaxLength = true; + } + } else if (!reachedStringMaxLength && _.isString(value)) { + pushed = pushArray('string', compoundKeyPath, value); + if (!pushed) { + reachedStringMaxLength = true; + } + } + + if ( + reachedBoolMaxLength && + reachedNumberMaxLength && + reachedStringMaxLength + ) { + console.warn( + `Max array length reached for ${compoundKeyPath} with value ${value}`, + ); + break; + } + } + } + + return output; +}; + +type _VectorLogFields = { + h?: string; // host + sn?: number; // severity number + st?: string; // severity text +}; + +type _VectorSpanFileds = { + et?: number; // end timestamp + p_id?: string; // parent id + s_n?: string; // span name +}; + +export type VectorLog = _VectorLogFields & + _VectorSpanFileds & { + authorization: string | null; + b: JSONBlob; + hdx_platform: LogPlatform; + hdx_token: string | null; + r: string; // raw + s_id?: string; // span id + sv: string; // service + t_id?: string; // trace id + ts: number; // timestamp + tso: number; // observed timestamp + }; + +export type VectorSpan = { + atrs: JSONBlob; // attributes + authorization?: string | null; + et: number; // end timestamp + hdx_platform: string; + hdx_token: string | null; + n: string; // name + p_id: string; // parent id + r: string; // raw + s_id: string; // span id + st: number; // start timestamp + t_id: string; // trace id + tso: number; // observed timestamp +}; + +export type VectorMetric = { + authorization?: string; + b: JSONBlob; // tags + dt: string; // data type + hdx_platform: string; + hdx_token: string; + n: string; // name + ts: number; // timestamp + tso: number; // observed timestamp + v: number; // value +}; + +abstract class ParsingInterface { + abstract _parse( + log: T, + ...args: any[] + ): LogStreamModel | MetricModel | RrwebEventModel; + + parse(logs: T[], ...args: any[]) { + const parsedLogs = []; + for (const log of logs) { + try { + parsedLogs.push(this._parse(log, ...args)); + } catch (e) { + // continue if parser fails to parse single log + console.warn(e); + } + } + return parsedLogs; + } +} + +class VectorLogParser extends ParsingInterface { + getType(log: VectorLog): LogType { + if (log.hdx_platform === LogPlatform.OtelTraces) { + return LogType.Span; + } else if (log.hdx_platform === LogPlatform.OtelMetrics) { + return LogType.Metric; + } + return LogType.Log; + } + + _parse(log: VectorLog): LogStreamModel { + return { + ...mapObjectToKeyValuePairs(log.b), + _platform: log.hdx_platform, + _service: log.sv, + _source: log.r, + observed_timestamp: log.tso, + timestamp: log.ts, + type: this.getType(log), + // Log + _host: log.h, + severity_text: log.st, + severity_number: log.sn, + // Span + end_timestamp: log.et, + span_name: log.s_n, + parent_span_id: log.p_id, + span_id: log.s_id, + trace_id: log.t_id, + }; + } +} + +class VectorMetricParser extends ParsingInterface { + _parse(metric: VectorMetric): MetricModel { + return { + _string_attributes: metric.b, + data_type: metric.dt, + name: metric.n, + timestamp: metric.ts, + value: metric.v, + }; + } +} + +class VectorRrwebParser extends ParsingInterface { + _parse(log: VectorLog): RrwebEventModel { + return { + ...mapObjectToKeyValuePairs(log.b), + _service: log.sv, + _source: log.r, + timestamp: log.ts, + }; + } +} + +// TODO: do this on the ingestor side ? +export const extractApiKey = (log: VectorLog | VectorSpan | VectorMetric) => { + if (log.authorization?.includes('Bearer')) { + return log.authorization.split('Bearer ')[1]; + } + return log.hdx_token; +}; + +export const vectorLogParser = new VectorLogParser(); +export const vectorMetricParser = new VectorMetricParser(); +export const vectorRrwebParser = new VectorRrwebParser(); diff --git a/packages/api/src/utils/logger.ts b/packages/api/src/utils/logger.ts new file mode 100644 index 00000000..8b15153c --- /dev/null +++ b/packages/api/src/utils/logger.ts @@ -0,0 +1,70 @@ +import _ from 'lodash'; +import expressWinston from 'express-winston'; +import winston, { addColors } from 'winston'; +import { getWinsonTransport } from '@hyperdx/node-opentelemetry'; + +import { + APP_TYPE, + HYPERDX_API_KEY, + HYPERDX_INGESTOR_ENDPOINT, + IS_DEV, + IS_PROD, +} from '../config'; + +import type { IUser } from '../models/user'; + +// LOCAL DEV ONLY +addColors({ + error: 'bold red', + warn: 'bold yellow', + info: 'white', + http: 'gray', + verbose: 'bold magenta', + debug: 'green', + silly: 'cyan', +}); + +const MAX_LEVEL = IS_PROD ? 'debug' : 'debug'; +const DEFAULT_FORMAT = IS_DEV + ? winston.format.combine( + winston.format.errors({ stack: true }), + winston.format.colorize({ all: true }), + winston.format.timestamp({ format: 'MM/DD/YY HH:MM:SS' }), + winston.format.printf( + info => `[${info.level}] ${info.timestamp} ${info.message}`, + ), + ) + : winston.format.combine( + winston.format.errors({ stack: true }), + winston.format.json(), + ); + +const hyperdxTransport = HYPERDX_API_KEY + ? getWinsonTransport(MAX_LEVEL, { + bufferSize: APP_TYPE === 'scheduled-task' ? 1 : 100, + ...(HYPERDX_INGESTOR_ENDPOINT && { baseUrl: HYPERDX_INGESTOR_ENDPOINT }), + }) + : null; + +export const expressLogger = expressWinston.logger({ + format: DEFAULT_FORMAT, + msg: IS_PROD + ? undefined + : 'HTTP {{res.statusCode}} {{req.method}} {{req.url}} {{res.responseTime}}ms', + transports: [ + new winston.transports.Console(), + ...(hyperdxTransport ? [hyperdxTransport] : []), + ], + meta: IS_PROD, +}); + +const logger = winston.createLogger({ + level: MAX_LEVEL, + format: DEFAULT_FORMAT, + transports: [ + new winston.transports.Console(), + ...(hyperdxTransport ? [hyperdxTransport] : []), + ], +}); + +export default logger; diff --git a/packages/api/src/utils/miner.ts b/packages/api/src/utils/miner.ts new file mode 100644 index 00000000..0431b839 --- /dev/null +++ b/packages/api/src/utils/miner.ts @@ -0,0 +1,31 @@ +import axios from 'axios'; +import ms from 'ms'; + +import * as config from '../config'; +import logger from './logger'; + +const MAX_LOG_LINES = 1e4; + +export const getLogsPatterns = async ( + teamId: string, + lines: string[][], +): Promise<{ + patterns: Record; + result: Record; +}> => { + if (lines.length > MAX_LOG_LINES) { + logger.error(`Too many log lines requested: ${lines.length}`); + } + + return axios({ + method: 'POST', + url: `${config.MINER_API_URL}/logs`, + data: { + team_id: teamId, + lines: lines.slice(0, MAX_LOG_LINES), + }, + maxContentLength: Infinity, + maxBodyLength: Infinity, + timeout: ms('2 minute'), + }).then(response => response.data); +}; diff --git a/packages/api/src/utils/passport.ts b/packages/api/src/utils/passport.ts new file mode 100644 index 00000000..786691ee --- /dev/null +++ b/packages/api/src/utils/passport.ts @@ -0,0 +1,55 @@ +import passport from 'passport'; +import { Strategy as LocalStrategy } from 'passport-local'; + +import logger from './logger'; +import User from '../models/user'; +import { findUserById } from '../controllers/user'; + +import type { UserDocument } from '../models/user'; + +passport.serializeUser(function (user, done) { + done(null, (user as any)._id); +}); + +passport.deserializeUser(function (id: string, done) { + findUserById(id) + .then(user => { + if (user == null) { + return done(new Error('User not found')); + } + done(null, user as UserDocument); + }) + .catch(done); +}); + +// Use local passport strategy via passport-local-mongoose plugin +const passportLocalMongooseAuthenticate = (User as any).authenticate(); + +passport.use( + new LocalStrategy( + { + usernameField: 'email', + }, + async function (username, password, done) { + try { + const { user, error } = await passportLocalMongooseAuthenticate( + username, + password, + ); + if (error) { + logger.info({ + message: `Login for "${username}" failed, ${error}"`, + type: 'user_login', + authType: 'password', + }); + } + return done(null, user, error); + } catch (err) { + logger.error(`Login for "${username}" failed, error: ${err}"`); + return done(err); + } + }, + ), +); + +export default passport; diff --git a/packages/api/src/utils/queue.ts b/packages/api/src/utils/queue.ts new file mode 100644 index 00000000..79cae586 --- /dev/null +++ b/packages/api/src/utils/queue.ts @@ -0,0 +1,22 @@ +export class LimitedSizeQueue { + private readonly _limit: number; + + private readonly _queue: T[]; + + constructor(limit: number) { + this._limit = limit; + this._queue = []; + } + + enqueue(item: T) { + this._queue.push(item); + if (this._queue.length === this._limit + 1) { + // randomly remove an item + this._queue.splice(Math.floor(Math.random() * this._limit), 1); + } + } + + toArray() { + return this._queue; + } +} diff --git a/packages/api/src/utils/rateLimiter.ts b/packages/api/src/utils/rateLimiter.ts new file mode 100644 index 00000000..1d3117b7 --- /dev/null +++ b/packages/api/src/utils/rateLimiter.ts @@ -0,0 +1,14 @@ +import rateLimit, { Options } from 'express-rate-limit'; +import RedisStore from 'rate-limit-redis'; + +import redisClient from './redis'; + +export default (config?: Partial) => async (req, rs, next) => { + return rateLimit({ + ...config, + // Redis store configuration + store: new RedisStore({ + sendCommand: (...args: string[]) => redisClient.sendCommand(args), + }), + })(req, rs, next); +}; diff --git a/packages/api/src/utils/redis.ts b/packages/api/src/utils/redis.ts new file mode 100644 index 00000000..27d8da28 --- /dev/null +++ b/packages/api/src/utils/redis.ts @@ -0,0 +1,15 @@ +import { createClient } from 'redis'; +import { serializeError } from 'serialize-error'; + +import * as config from '../config'; +import logger from '../utils/logger'; + +const client = createClient({ + url: config.REDIS_URL, +}); + +client.on('error', (err: any) => { + logger.error('Redis error: ', serializeError(err)); +}); + +export default client; diff --git a/packages/api/src/utils/slack.ts b/packages/api/src/utils/slack.ts new file mode 100644 index 00000000..e5c5d4d3 --- /dev/null +++ b/packages/api/src/utils/slack.ts @@ -0,0 +1,10 @@ +import _ from 'lodash'; +import { IncomingWebhook } from '@slack/webhook'; + +export function postMessageToWebhook(webhookUrl: string, message: any) { + const webhook = new IncomingWebhook(webhookUrl); + return webhook.send({ + text: message.text, + blocks: message.blocks, + }); +} diff --git a/packages/api/src/utils/validators.ts b/packages/api/src/utils/validators.ts new file mode 100644 index 00000000..8dfb7ec0 --- /dev/null +++ b/packages/api/src/utils/validators.ts @@ -0,0 +1,6 @@ +export const validatePassword = (password: string) => { + if (!password || password.length < 8 || password.length > 64) { + return false; + } + return true; +}; diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json new file mode 100644 index 00000000..1c2d6f63 --- /dev/null +++ b/packages/api/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "downlevelIteration": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "importHelpers": true, + "lib": ["ES2022", "dom"], + "module": "Node16", + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitThis": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "outDir": "build", + "resolveJsonModule": true, + "skipLibCheck": false, + "sourceMap": true, + "strict": true, + "strictNullChecks": false, + "target": "ES2022" + }, + "include": ["src"] +} diff --git a/packages/app/.Dockerignore b/packages/app/.Dockerignore new file mode 100644 index 00000000..6593fdce --- /dev/null +++ b/packages/app/.Dockerignore @@ -0,0 +1,2 @@ +**/node_modules +**/.next \ No newline at end of file diff --git a/packages/app/.eslintrc.js b/packages/app/.eslintrc.js new file mode 100644 index 00000000..8d229dc6 --- /dev/null +++ b/packages/app/.eslintrc.js @@ -0,0 +1,24 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'prettier'], + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + }, + extends: [ + 'next', + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + rules: { + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/ban-types': 'warn', + '@typescript-eslint/no-empty-function': 'warn', + 'react/display-name': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-empty-function': 'off', + }, +}; diff --git a/packages/app/.gitignore b/packages/app/.gitignore new file mode 100644 index 00000000..12a64bec --- /dev/null +++ b/packages/app/.gitignore @@ -0,0 +1,6 @@ + +# Sentry +.sentryclirc + +# Sentry +next.config.original.js diff --git a/packages/app/Dockerfile b/packages/app/Dockerfile new file mode 100644 index 00000000..d78bc662 --- /dev/null +++ b/packages/app/Dockerfile @@ -0,0 +1,67 @@ +## base ############################################################################################# +FROM node:18.15.0-alpine AS base +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + + +COPY .yarn ./.yarn +COPY .yarnrc yarn.lock ./packages/app/package.json ./packages/app/tsconfig.json ./packages/app/next.config.js ./packages/app/mdx.d.ts ./packages/app/.eslintrc.js ./ +RUN yarn install --frozen-lockfile && yarn cache clean + + +## dev ############################################################################################# +FROM base AS dev + +EXPOSE 8080 + +ENTRYPOINT ["yarn"] +CMD ["dev"] + +## builder ######################################################################################### +# Rebuild the source code only when needed +FROM base AS builder + +# Expose NEXT_PUBLIC_API_SERVER_URL during build time if needed +ARG NEXT_PUBLIC_API_SERVER_URL +ENV NEXT_PUBLIC_API_SERVER_URL $NEXT_PUBLIC_API_SERVER_URL + +COPY ./packages/app/tsconfig.json ./packages/app/next.config.js ./packages/app/mdx.d.ts ./packages/app/.eslintrc.js ./ +COPY ./packages/app/src ./src +COPY ./packages/app/pages ./pages +COPY ./packages/app/public ./public +COPY ./packages/app/styles ./styles +COPY ./packages/app/json ./json +COPY --from=base /app/node_modules ./node_modules +RUN yarn build && yarn install --production --ignore-scripts --prefer-offline + + +## prod ############################################################################################ +FROM node:18.15.0-alpine AS prod +WORKDIR /app + +ENV NODE_ENV production + +RUN addgroup -g 1001 -S nodejs +RUN adduser -S nextjs -u 1001 + +# You only need to copy next.config.js if you are NOT using the default configuration +# COPY --from=builder /app/next.config.js ./ +COPY --from=builder /app/public ./public +COPY --from=builder /app/json ./json +COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json + +USER nextjs + +EXPOSE 8080 + +ENV PORT 8080 + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry. +ENV NEXT_TELEMETRY_DISABLED 1 + +CMD ["node_modules/.bin/next", "start"] diff --git a/packages/app/jest.config.js b/packages/app/jest.config.js new file mode 100644 index 00000000..55ef0ca0 --- /dev/null +++ b/packages/app/jest.config.js @@ -0,0 +1,23 @@ +module.exports = { + preset: 'ts-jest/presets/js-with-ts', + testEnvironment: '@deploysentinel/jest-rtl-debugger/environment', + setupFilesAfterEnv: ['/setup-jest.ts'], + globalSetup: '@deploysentinel/jest-rtl-debugger/globalSetup', + roots: ['/src'], + transform: { + '^.+\\.tsx?$': 'ts-jest', + '^.+\\.(css|scss|sass)$': + '@deploysentinel/jest-rtl-debugger/transforms/css', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', + transformIgnorePatterns: ['/node_modules/(?!(ky|ky-universal))'], + globals: { + // This is necessary because next.js forces { "jsx": "preserve" }, but ts-jest appears to require { "jsx": "react-jsx" } + 'ts-jest': { + tsconfig: { + jsx: 'react-jsx', + }, + }, + }, +}; diff --git a/packages/app/mdx.d.ts b/packages/app/mdx.d.ts new file mode 100644 index 00000000..2189a5df --- /dev/null +++ b/packages/app/mdx.d.ts @@ -0,0 +1,4 @@ +declare module '*.mdx' { + export default any; + export const meta: any; +} diff --git a/packages/app/next-env.d.ts b/packages/app/next-env.d.ts new file mode 100644 index 00000000..4f11a03d --- /dev/null +++ b/packages/app/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/packages/app/next.config.js b/packages/app/next.config.js new file mode 100644 index 00000000..7386eff2 --- /dev/null +++ b/packages/app/next.config.js @@ -0,0 +1,28 @@ +const { version } = require('./package.json'); + +const withNextra = require('nextra')({ + theme: 'nextra-theme-docs', + themeConfig: './src/nextra.config.tsx', +}); + +module.exports = withNextra({ + async headers() { + return [ + { + source: '/(.*)?', // Matches all pages + headers: [ + { + key: 'X-Frame-Options', + value: 'DENY', + }, + ], + }, + ]; + }, + // This slows down builds by 2x for some reason... + swcMinify: false, + publicRuntimeConfig: { + version, + }, + productionBrowserSourceMaps: false, +}); diff --git a/packages/app/package.json b/packages/app/package.json new file mode 100644 index 00000000..8310ec13 --- /dev/null +++ b/packages/app/package.json @@ -0,0 +1,117 @@ +{ + "name": "@hyperdx/app", + "version": "1.0.0", + "private": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "scripts": { + "dev": "next dev -p 8080", + "build": "next build", + "start": "next start", + "lint": "eslint . --ext .ts,.tsx", + "ci:lint": "yarn lint", + "ci:unit": "jest --coverage" + }, + "dependencies": { + "@hyperdx/browser": "^0.18.3", + "@hyperdx/lucene": "^3.1.1", + "@microsoft/fetch-event-source": "^2.0.1", + "@monaco-editor/react": "^4.3.1", + "@tanstack/react-table": "^8.7.9", + "@tanstack/react-virtual": "^3.0.0-beta.54", + "@types/react-csv": "^1.1.3", + "ansi-to-html": "^0.7.2", + "bootstrap": "^5.1.3", + "chrono-node": "^2.5.0", + "classnames": "^2.3.1", + "date-fns": "^2.28.0", + "date-fns-tz": "^2.0.0", + "esbuild": "^0.14.47", + "fuse.js": "^6.6.2", + "immer": "^9.0.21", + "ky": "^0.30.0", + "ky-universal": "^0.10.1", + "lodash": "^4.17.21", + "monaco-editor": "^0.31.1", + "next": "^12.3.4", + "next-query-params": "^4.1.0", + "next-seo": "^4.28.1", + "nextra": "2.0.1", + "nextra-theme-docs": "^2.0.2", + "normalize-url": "4", + "pluralize": "^8.0.0", + "react": "^17.0.2", + "react-bootstrap": "^2.4.0", + "react-bootstrap-range-slider": "^3.0.8", + "react-copy-to-clipboard": "^5.1.0", + "react-csv": "^2.2.2", + "react-datepicker": "^4.10.0", + "react-dom": "^17.0.2", + "react-error-boundary": "^3.1.4", + "react-fast-marquee": "^1.3.5", + "react-grid-layout": "^1.3.4", + "react-hook-form": "^7.43.8", + "react-hotkeys-hook": "^4.3.7", + "react-intersection-observer": "^9.3.4", + "react-json-tree": "^0.17.0", + "react-markdown": "^8.0.4", + "react-merge-refs": "^2.0.1", + "react-modern-drawer": "^1.2.0", + "react-query": "^3.39.1", + "react-reflex": "^4.0.9", + "react-select": "^5.7.0", + "react-slider": "^2.0.1", + "react-sliding-pane": "^7.3.0", + "react-sortable-hoc": "^2.0.0", + "react-syntax-highlighter": "^15.4.5", + "react-table": "^7.8.0", + "react-toastify": "^8.1.0", + "react-use": "^17.4.0", + "react-useportal": "^1.0.18", + "react-virtual": "^2.10.4", + "react-virtualized-auto-sizer": "^1.0.7", + "recharts": "^2.5.0", + "remark-gfm": "^3.0.1", + "remark-prism": "^1.3.6", + "rrweb": "2.0.0-alpha.8", + "sass": "^1.54.8", + "serialize-query-params": "^2.0.2", + "strip-ansi": "^6.0.1", + "swr": "^1.3.0", + "timestamp-nano": "^1.0.1", + "use-query-params": "^2.1.2" + }, + "devDependencies": { + "@deploysentinel/jest-rtl-debugger": "^0.2.3", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^12.1.4", + "@testing-library/user-event": "^14.4.3", + "@types/hyperdx__lucene": "npm:@types/lucene", + "@types/intercom-web": "^2.8.18", + "@types/jest": "^28.1.6", + "@types/lodash": "^4.14.186", + "@types/pluralize": "^0.0.29", + "@types/react": "^17.0.52", + "@types/react-copy-to-clipboard": "^5.0.2", + "@types/react-datepicker": "^4.10.0", + "@types/react-grid-layout": "^1.3.2", + "@types/react-slider": "^1.3.1", + "@types/react-syntax-highlighter": "^13.5.2", + "@types/react-table": "^7.7.14", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "eslint": "^8.34.0", + "eslint-config-next": "^12.3.3", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^28.1.3", + "ts-jest": "^28.0.7", + "typescript": "^4.9.5" + }, + "resolutions": { + "@types/react": "17.0.52" + } +} diff --git a/packages/app/pages/_app.tsx b/packages/app/pages/_app.tsx new file mode 100644 index 00000000..32817c6e --- /dev/null +++ b/packages/app/pages/_app.tsx @@ -0,0 +1,81 @@ +import Head from 'next/head'; +import React from 'react'; +import SSRProvider from 'react-bootstrap/SSRProvider'; +import type { AppProps } from 'next/app'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { ReactQueryDevtools } from 'react-query/devtools'; +import { ToastContainer } from 'react-toastify'; +import { NextAdapter } from 'next-query-params'; +import { QueryParamProvider } from 'use-query-params'; + +import * as config from '../src/config'; +import { QueryParamProvider as HDXQueryParamProvider } from '../src/useQueryParam'; +import { UserPreferencesProvider } from '../src/useUserPreferences'; + +import 'react-toastify/dist/ReactToastify.css'; + +import '../styles/globals.css'; +import '../styles/app.scss'; +import '../src/LandingPage.scss'; + +const queryClient = new QueryClient(); + +import HyperDX from '@hyperdx/browser'; + +if (config.HDX_API_KEY != null) { + HyperDX.init({ + ...(config.HDX_COLLECTOR_URL != null + ? { + url: config.HDX_COLLECTOR_URL, + } + : {}), + apiKey: config.HDX_API_KEY, + consoleCapture: true, + maskAllInputs: true, + maskAllText: true, + service: config.HDX_SERVICE_NAME, + tracePropagationTargets: [/localhost/i, /hyperdx\.io/i], + }); +} + +export default function MyApp({ Component, pageProps }: AppProps) { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/packages/app/pages/_error.tsx b/packages/app/pages/_error.tsx new file mode 100644 index 00000000..196dc5d4 --- /dev/null +++ b/packages/app/pages/_error.tsx @@ -0,0 +1,34 @@ +/** + * NOTE: This requires `@sentry/nextjs` version 7.3.0 or higher. + * + * NOTE: If using this with `next` version 12.2.0 or lower, uncomment the + * penultimate line in `CustomErrorComponent`. + * + * This page is loaded by Nextjs: + * - on the server, when data-fetching methods throw or reject + * - on the client, when `getInitialProps` throws or rejects + * - on the client, when a React lifecycle method throws or rejects, and it's + * caught by the built-in Nextjs error boundary + * + * See: + * - https://nextjs.org/docs/basic-features/data-fetching/overview + * - https://nextjs.org/docs/api-reference/data-fetching/get-initial-props + * - https://reactjs.org/docs/error-boundaries.html + */ + +import NextErrorComponent from 'next/error'; + +const CustomErrorComponent = (props: any) => { + // If you're using a Nextjs version prior to 12.2.1, uncomment this to + // compensate for https://github.com/vercel/next.js/issues/8592 + // Sentry.captureUnderscoreErrorException(props); + + return ; +}; + +CustomErrorComponent.getInitialProps = async (contextData: any) => { + // This will contain the status code of the response + return NextErrorComponent.getInitialProps(contextData); +}; + +export default CustomErrorComponent; diff --git a/packages/app/pages/chart.tsx b/packages/app/pages/chart.tsx new file mode 100644 index 00000000..e2ebd5c0 --- /dev/null +++ b/packages/app/pages/chart.tsx @@ -0,0 +1,3 @@ +import ChartPage from '../src/ChartPage'; + +export default ChartPage; diff --git a/packages/app/pages/dashboards/[dashboardId].tsx b/packages/app/pages/dashboards/[dashboardId].tsx new file mode 100644 index 00000000..546c210b --- /dev/null +++ b/packages/app/pages/dashboards/[dashboardId].tsx @@ -0,0 +1,2 @@ +import DashboardPage from '../../src/DashboardPage'; +export default DashboardPage; diff --git a/packages/app/pages/dashboards/index.tsx b/packages/app/pages/dashboards/index.tsx new file mode 100644 index 00000000..546c210b --- /dev/null +++ b/packages/app/pages/dashboards/index.tsx @@ -0,0 +1,2 @@ +import DashboardPage from '../../src/DashboardPage'; +export default DashboardPage; diff --git a/packages/app/pages/index.tsx b/packages/app/pages/index.tsx new file mode 100644 index 00000000..f2282f3c --- /dev/null +++ b/packages/app/pages/index.tsx @@ -0,0 +1,2 @@ +import LandingPage from '../src/LandingPage'; +export default LandingPage; diff --git a/packages/app/pages/join-team.tsx b/packages/app/pages/join-team.tsx new file mode 100644 index 00000000..d1edd890 --- /dev/null +++ b/packages/app/pages/join-team.tsx @@ -0,0 +1,3 @@ +import JoinTeamPage from '../src/JoinTeamPage'; + +export default JoinTeamPage; diff --git a/packages/app/pages/login/index.tsx b/packages/app/pages/login/index.tsx new file mode 100644 index 00000000..94fe3ff3 --- /dev/null +++ b/packages/app/pages/login/index.tsx @@ -0,0 +1,9 @@ +import AuthPage from '../../src/AuthPage'; + +export default function Login() { + return ( +
+ +
+ ); +} diff --git a/packages/app/pages/register.tsx b/packages/app/pages/register.tsx new file mode 100644 index 00000000..67d1dd4c --- /dev/null +++ b/packages/app/pages/register.tsx @@ -0,0 +1,8 @@ +import AuthPage from '../src/AuthPage'; +export default function Register() { + return ( +
+ +
+ ); +} diff --git a/packages/app/pages/search/[savedSearchId].tsx b/packages/app/pages/search/[savedSearchId].tsx new file mode 100644 index 00000000..bc8cdee0 --- /dev/null +++ b/packages/app/pages/search/[savedSearchId].tsx @@ -0,0 +1,3 @@ +import SearchPage from '../../src/SearchPage'; + +export default SearchPage; diff --git a/packages/app/pages/search/index.tsx b/packages/app/pages/search/index.tsx new file mode 100644 index 00000000..bc8cdee0 --- /dev/null +++ b/packages/app/pages/search/index.tsx @@ -0,0 +1,3 @@ +import SearchPage from '../../src/SearchPage'; + +export default SearchPage; diff --git a/packages/app/pages/sessions.tsx b/packages/app/pages/sessions.tsx new file mode 100644 index 00000000..4e5850da --- /dev/null +++ b/packages/app/pages/sessions.tsx @@ -0,0 +1,3 @@ +import SessionsPage from '../src/SessionsPage'; + +export default SessionsPage; diff --git a/packages/app/pages/team/index.tsx b/packages/app/pages/team/index.tsx new file mode 100644 index 00000000..8a0d4bf9 --- /dev/null +++ b/packages/app/pages/team/index.tsx @@ -0,0 +1,2 @@ +import TeamPage from '../../src/TeamPage'; +export default TeamPage; diff --git a/packages/app/public/Icon32.png b/packages/app/public/Icon32.png new file mode 100644 index 00000000..f97e18aa Binary files /dev/null and b/packages/app/public/Icon32.png differ diff --git a/packages/app/setup-jest.ts b/packages/app/setup-jest.ts new file mode 100644 index 00000000..02fbfdb8 --- /dev/null +++ b/packages/app/setup-jest.ts @@ -0,0 +1,4 @@ +import '@testing-library/jest-dom'; +import setup from '@deploysentinel/jest-rtl-debugger/setup'; + +setup(); diff --git a/packages/app/src/AppNav.tsx b/packages/app/src/AppNav.tsx new file mode 100644 index 00000000..d04efe53 --- /dev/null +++ b/packages/app/src/AppNav.tsx @@ -0,0 +1,854 @@ +import Link from 'next/link'; +import cx from 'classnames'; +import { useQueryClient } from 'react-query'; +import Router, { useRouter } from 'next/router'; +import { + NumberParam, + StringParam, + useQueryParam, + useQueryParams, + withDefault, +} from 'use-query-params'; +import HyperDX from '@hyperdx/browser'; +import { useEffect, useState } from 'react'; + +import api from './api'; +import Logo from './Logo'; +import { API_SERVER_URL } from './config'; +import { useWindowSize } from './utils'; +import { Button } from 'react-bootstrap'; +import Icon from './Icon'; +import AuthLoadingBlocker from './AuthLoadingBlocker'; + +const APP_PERFORMANCE_DASHBOARD_CONFIG = { + id: '', + name: 'App Performance', + charts: [ + { + id: '1624425', + name: 'P95 Latency by Operation', + x: 0, + y: 0, + w: 8, + h: 3, + series: [ + { + type: 'time', + aggFn: 'p95', + field: 'duration', + where: '', + groupBy: ['span_name'], + }, + ], + }, + { + id: '401924', + name: 'Operations with Errors', + x: 8, + y: 0, + w: 4, + h: 3, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'level:err', + groupBy: ['span_name'], + }, + ], + }, + { + id: '883200', + name: 'Count of Operations', + x: 0, + y: 3, + w: 8, + h: 3, + series: [ + { + type: 'time', + aggFn: 'count', + where: '', + groupBy: ['span_name'], + }, + ], + }, + ], +}; +const HTTP_SERVER_DASHBOARD_CONFIG = { + id: '', + name: 'HTTP Server', + charts: [ + { + id: '312739', + name: 'P95 Latency by Endpoint', + x: 0, + y: 0, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'p95', + field: 'duration', + where: 'span.kind:server', + groupBy: ['http.route'], + }, + ], + }, + { + id: '434437', + name: 'HTTP Status Codes', + x: 0, + y: 2, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'span.kind:server', + groupBy: ['http.status_code'], + }, + ], + }, + { + id: '69137', + name: 'HTTP 4xx, 5xx', + x: 6, + y: 4, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'http.status_code:>=400 span.kind:server', + groupBy: ['http.status_code'], + }, + ], + }, + { + id: '34708', + name: 'HTTP 5xx by Endpoint', + x: 6, + y: 2, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'span.kind:server http.status_code:>=500', + groupBy: ['http.route'], + }, + ], + }, + { + id: '58773', + name: 'Request Volume by Endpoint', + x: 6, + y: 0, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'span.kind:server', + groupBy: ['http.route'], + }, + ], + }, + ], +}; +const REDIS_DASHBOARD_CONFIG = { + id: '', + name: 'Redis', + charts: [ + { + id: '38463', + name: 'GET Operations', + x: 0, + y: 0, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'db.system:"redis" span_name:GET', + groupBy: [], + }, + ], + }, + { + id: '488836', + name: 'P95 GET Latency', + x: 0, + y: 2, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'p95', + field: 'duration', + where: 'db.system:"redis" span_name:GET', + groupBy: [], + }, + ], + }, + { + id: '8355753', + name: 'SET Operations', + x: 6, + y: 0, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'count', + where: 'db.system:"redis" span_name:SET', + groupBy: [], + }, + ], + }, + { + id: '93278', + name: 'P95 SET Latency', + x: 6, + y: 2, + w: 6, + h: 2, + series: [ + { + type: 'time', + aggFn: 'p95', + field: 'duration', + where: 'db.system:"redis" span_name:SET', + groupBy: [], + }, + ], + }, + ], +}; +const MONGO_DASHBOARD_CONFIG = { + id: '', + name: 'MongoDB', + charts: [ + { + id: '98180', + name: 'P95 Read Operation Latency by Collection', + x: 0, + y: 0, + w: 6, + h: 3, + series: [ + { + type: 'time', + aggFn: 'p95', + field: 'duration', + where: + 'db.system:mongo (db.operation:"find" OR db.operation:"findOne" OR db.operation:"aggregate")', + groupBy: ['db.mongodb.collection'], + }, + ], + }, + { + id: '28877', + name: 'P95 Write Operation Latency by Collection', + x: 6, + y: 0, + w: 6, + h: 3, + series: [ + { + type: 'time', + aggFn: 'p95', + field: 'duration', + where: + 'db.system:mongo (db.operation:"insert" OR db.operation:"findOneAndUpdate" OR db.operation:"save" OR db.operation:"findAndModify")', + groupBy: ['db.mongodb.collection'], + }, + ], + }, + { + id: '9901546', + name: 'Count of Write Operations by Collection', + x: 6, + y: 3, + w: 6, + h: 3, + series: [ + { + type: 'time', + aggFn: 'count', + where: + 'db.system:mongo (db.operation:"insert" OR db.operation:"findOneAndUpdate" OR db.operation:"save" OR db.operation:"findAndModify")', + groupBy: ['db.mongodb.collection'], + }, + ], + }, + { + id: '6894669', + name: 'Count of Read Operations by Collection', + x: 0, + y: 3, + w: 6, + h: 3, + series: [ + { + type: 'time', + aggFn: 'count', + where: + 'db.system:mongo (db.operation:"find" OR db.operation:"findOne" OR db.operation:"aggregate")', + groupBy: ['db.mongodb.collection'], + }, + ], + }, + ], +}; +const HYPERDX_USAGE_DASHBOARD_CONFIG = { + id: '', + name: 'HyperDX Usage', + charts: [ + { + id: '15gykg', + name: 'Log/Span Usage in Bytes', + x: 0, + y: 0, + w: 3, + h: 2, + series: [ + { + table: 'logs', + type: 'number', + aggFn: 'sum', + field: 'hyperdx_event_size', + where: '', + groupBy: [], + }, + ], + }, + { + id: '1k5pul', + name: 'Logs/Span Usage over Time', + x: 3, + y: 0, + w: 9, + h: 3, + series: [ + { + table: 'logs', + type: 'time', + aggFn: 'sum', + field: 'hyperdx_event_size', + where: '', + groupBy: [], + }, + ], + }, + ], +}; + +function PresetDashboardLink({ + query, + config, + name, +}: { + query: any; + config: any; + name: string; +}) { + return ( + + + {name} + + + ); +} + +function PresetSearchLink({ query, name }: { query: string; name: string }) { + const { query: routerQuery } = useRouter(); + const [searchedQuery] = useQueryParam('q', withDefault(StringParam, '')); + const [timeRangeQuery] = useQueryParams({ + from: withDefault(NumberParam, -1), + to: withDefault(NumberParam, -1), + }); + const [inputTimeQuery] = useQueryParam('tq', withDefault(StringParam, ''), { + updateType: 'pushIn', + enableBatching: true, + }); + + return ( + + + {name} + + + ); +} + +export default function AppNav({ fixed = false }: { fixed?: boolean }) { + useEffect(() => { + let redirectUrl; + try { + redirectUrl = window.sessionStorage.getItem('hdx-login-redirect-url'); + } catch (e: any) { + console.error(e); + } + // conditional redirect + if (redirectUrl) { + // with router.push the page may be added to history + // the browser on history back will go back to this page and then forward again to the redirected page + // you can prevent this behaviour using location.replace + window.sessionStorage.removeItem('hdx-login-redirect-url'); + Router.push(redirectUrl); + } + }, []); + + const { + data: logViewsData, + isLoading: isLogViewsLoading, + refetch: refetchLogViews, + } = api.useLogViews(); + const logViews = logViewsData?.data ?? []; + + const { data: dashboardsData, isLoading: isDashboardsLoading } = + api.useDashboards(); + const dashboards = dashboardsData?.data ?? []; + + const router = useRouter(); + const { pathname, query } = router; + + const [timeRangeQuery] = useQueryParams({ + from: withDefault(NumberParam, -1), + to: withDefault(NumberParam, -1), + }); + const [inputTimeQuery] = useQueryParam('tq', withDefault(StringParam, ''), { + updateType: 'pushIn', + enableBatching: true, + }); + + const { data: meData } = api.useMe(); + + const [isSearchExpanded, setIsSearchExpanded] = useState(true); + const [isDashboardsExpanded, setIsDashboardExpanded] = useState(true); + + const { width } = useWindowSize(); + const [isPreferCollapsed, setIsPreferCollapsed] = useState< + undefined | boolean + >(undefined); + + const isSmallScreen = (width ?? 1000) < 900; + const isCollapsed = isPreferCollapsed ?? isSmallScreen; + + const navWidth = isCollapsed ? 50 : 220; + + const { data: team, isLoading: teamIsLoading } = api.useTeam(); + + useEffect(() => { + HyperDX.addAction('user navigated', { + route: pathname, + query: JSON.stringify(query), + }); + }, [pathname, query]); + + useEffect(() => { + if (meData != null) { + HyperDX.enableAdvancedNetworkCapture(); + HyperDX.setGlobalAttributes({ + userEmail: meData.email, + userName: meData.name, + teamName: meData.team.name, + }); + } + }, [meData]); + return ( + <> + + {fixed &&
} +
+
+
+ + + {isCollapsed ? ( +
+ +
+ ) : ( + + )} +
+ + +
+
+
+ + + + {' '} + {!isCollapsed && Search} + + + + {!isCollapsed && ( + { + setIsSearchExpanded(!isSearchExpanded); + }} + /> + )} +
+ {isSearchExpanded && !isCollapsed && ( + <> +
+ SAVED SEARCHES +
+ {(logViews ?? []).length === 0 ? ( +
No saved searches
+ ) : null} + {(logViews ?? []).map(lv => ( + + +
+ {lv.name} +
+ {Array.isArray(lv.alerts) && lv.alerts.length > 0 ? ( + lv.alerts.some(a => a.state === 'ALERT') ? ( + + ) : ( + + ) + ) : null} +
+ + ))} +
PRESETS
+ + + + )} + {/* + + + Live Tail + + */} + + +
+
+ + + + {' '} + {!isCollapsed && Dashboards} + + + + {!isCollapsed && ( + { + setIsDashboardExpanded(!isDashboardsExpanded); + }} + /> + )} +
+
+ {isDashboardsExpanded && !isCollapsed && ( + <> + + + + New Dashboard + + +
+ SAVED DASHBOARDS +
+ {(dashboards ?? []).length === 0 ? ( +
0 saved dashboards
+ ) : null} + {(dashboards ?? []).map((dashboard: any) => ( + + + {dashboard.name} + + + ))} +
PRESETS
+ + + + + + + )} +
+
+
+
+ Ready to use HyperDX Cloud? +
+ + + +
+
+ + +
+ + + {' '} + {!isCollapsed && Logout} + + +
+
+
+ + ); +} diff --git a/packages/app/src/AuthLoadingBlocker.tsx b/packages/app/src/AuthLoadingBlocker.tsx new file mode 100644 index 00000000..a9f09dac --- /dev/null +++ b/packages/app/src/AuthLoadingBlocker.tsx @@ -0,0 +1,32 @@ +import { useEffect, useRef, useState } from 'react'; + +import api from './api'; + +export default function AuthLoadingBlocker() { + const { data: meData } = api.useMe(); + + // increase number of periods rendered as a loading animation, 1 period per second + const [periods, setPeriods] = useState(0); + useEffect(() => { + const interval = setInterval(() => { + setPeriods(periods => (periods + 1) % 4); + }, 1000); + return () => clearInterval(interval); + }, []); + + return ( + <> + {meData == null && ( +
+ Loading HyperDX + {'.'.repeat(periods)} +
+ )} + + ); +} diff --git a/packages/app/src/AuthPage.tsx b/packages/app/src/AuthPage.tsx new file mode 100644 index 00000000..3a353f29 --- /dev/null +++ b/packages/app/src/AuthPage.tsx @@ -0,0 +1,150 @@ +import { Button, Form } from 'react-bootstrap'; +import { NextSeo } from 'next-seo'; +import { API_SERVER_URL } from './config'; +import { useRouter } from 'next/router'; +import { useEffect } from 'react'; +import Link from 'next/link'; + +import LandingHeader from './LandingHeader'; +import * as config from './config'; +import api from './api'; + +export default function AuthPage({ action }: { action: 'register' | 'login' }) { + const router = useRouter(); + const { err, msg } = router.query; + + const { data: installation } = api.useInstallation(); + + const verificationSent = msg === 'verify'; + + const title = `HyperDX - ${action === 'register' ? 'Sign up' : 'Login'}`; + + useEffect(() => { + // If an OSS user accidentally lands on /register after already creating a team + // redirect them to login instead + if ( + config.IS_OSS && + installation?.isTeamExisting === true && + action === 'register' + ) { + router.push('/login'); + } + }, [installation, action, router]); + + return ( +
+ + +
+
+
+ {config.IS_OSS && action === 'register' + ? 'Setup ' + : action === 'register' + ? 'Register for ' + : 'Login to '} + HyperDX +
+ {action === 'login' && ( +
Welcome back!
+ )} + {action === 'register' && config.IS_OSS === true && ( +
+ Let{"'"}s create your user account. +
+ )} +
+
+
+ + Email + + + + Password + + + {err != null && ( +
+ {err === 'missing' + ? 'Please provide a valid email and password' + : err === 'invalid' + ? 'Email or password is invalid' + : err === 'authFail' + ? 'Failed to login with email and password, please try again.' + : err === 'passwordAuthNotAllowed' + ? 'Password authentication is not allowed by your team admin.' + : err === 'teamAlreadyExists' + ? 'Team already exists, please login instead.' + : 'Unkown error occured, please try again later.'} +
+ )} + {verificationSent && ( +
+ Sent verification email! Please check your email inbox +
+ )} +
+ +
+ + {action === 'register' && config.IS_OSS === false && ( +
+ Already have an account? Log in{' '} + instead. +
+ )} + {action === 'login' && config.IS_OSS === false && ( +
+ Don{"'"}t have an account yet?{' '} + Register instead. +
+ )} +
+
+
+
+
+ ); +} diff --git a/packages/app/src/AutocompleteInput.tsx b/packages/app/src/AutocompleteInput.tsx new file mode 100644 index 00000000..c7dad6a7 --- /dev/null +++ b/packages/app/src/AutocompleteInput.tsx @@ -0,0 +1,242 @@ +import { useEffect, useMemo, useRef, useState } from 'react'; +import { Form, InputGroup, OverlayTrigger } from 'react-bootstrap'; +import Fuse from 'fuse.js'; + +import { useDebounce } from './utils'; + +export default function AutocompleteInput({ + inputRef, + value, + onChange, + placeholder = 'Search your events for anything...', + autocompleteOptions, + showHotkey = true, + size = 'lg', + aboveSuggestions, + belowSuggestions, + showSuggestionsOnEmpty, + suggestionsHeader = 'Properties', +}: { + inputRef: React.RefObject; + value: string; + onChange: (value: string) => void; + placeholder?: string; + showHotkey?: boolean; + size?: 'sm' | 'lg'; + autocompleteOptions?: { value: string; label: string }[]; + aboveSuggestions?: React.ReactNode; + belowSuggestions?: React.ReactNode; + showSuggestionsOnEmpty?: boolean; + suggestionsHeader?: string; +}) { + const suggestionsLimit = 10; + const inputGroupRef = useRef(null); + + const [isSearchInputFocused, setIsSearchInputFocused] = useState(false); + const [isInputDropdownOpen, setIsInputDropdownOpen] = useState(false); + + const [selectedAutocompleteIndex, setSelectedAutocompleteIndex] = + useState(-1); + + useEffect(() => { + if (isSearchInputFocused) { + setIsInputDropdownOpen(true); + } + }, [isSearchInputFocused]); + + const fuse = useMemo( + () => + new Fuse(autocompleteOptions ?? [], { + keys: ['value'], + threshold: 0, + ignoreLocation: true, + }), + [autocompleteOptions], + ); + + const debouncedValue = useDebounce(value, 200); + const suggestedProperties = useMemo(() => { + const tokens = debouncedValue.split(' '); + const lastToken = tokens[tokens.length - 1]; + + if (lastToken.length === 0 && showSuggestionsOnEmpty) { + return autocompleteOptions ?? []; + } + return fuse.search(lastToken).map(result => result.item); + }, [debouncedValue, fuse, autocompleteOptions, showSuggestionsOnEmpty]); + + const onAcceptSuggestion = (suggestion: string) => { + setSelectedAutocompleteIndex(-1); + + const newValue = + value.split(' ').slice(0, -1).join(' ') + + `${value.split(' ').length > 1 ? ' ' : ''}${suggestion}`; + onChange(newValue); + inputRef.current?.focus(); + }; + + return ( + { + // if opened is transitioning to false, but input is focused, ignore it + if (!opened && isSearchInputFocused) { + return; + } + + setIsInputDropdownOpen(opened); + }} + show={isInputDropdownOpen} + placement="bottom-start" + delay={{ show: 0, hide: 0 }} + overlay={({ style, ...props }) => ( +
+ {aboveSuggestions != null && ( +
{aboveSuggestions}
+ )} +
+ {suggestedProperties.length > 0 && ( +
+
+
{suggestionsHeader}
+ {suggestedProperties.length > suggestionsLimit && ( +
+ (Showing Top {suggestionsLimit}) +
+ )} +
+ {suggestedProperties + .slice(0, suggestionsLimit) + .map(({ value, label }, i) => ( +
{ + setSelectedAutocompleteIndex(i); + }} + onClick={() => { + onAcceptSuggestion(value); + }} + > + {label} +
+ ))} +
+ )} +
+ {belowSuggestions != null && ( +
+ {belowSuggestions} +
+ )} +
+ )} + popperConfig={{ + modifiers: [ + { + name: 'offset', + options: { + offset: [0, 8], + }, + }, + ], + }} + trigger={[]} + > + + onChange(e.target.value)} + onFocus={() => { + setSelectedAutocompleteIndex(-1); + setIsSearchInputFocused(true); + }} + onBlur={() => { + setSelectedAutocompleteIndex(-1); + setIsSearchInputFocused(false); + }} + onKeyDown={e => { + if (e.key === 'Escape' && e.target instanceof HTMLInputElement) { + e.target.blur(); + } + + // Autocomplete Navigation/Acceptance Keys + if (e.key === 'Tab' && e.target instanceof HTMLInputElement) { + if ( + suggestedProperties.length > 0 && + selectedAutocompleteIndex < suggestedProperties.length && + selectedAutocompleteIndex >= 0 + ) { + e.preventDefault(); + onAcceptSuggestion( + suggestedProperties[selectedAutocompleteIndex].value, + ); + } + } + if (e.key === 'Enter' && e.target instanceof HTMLInputElement) { + if ( + suggestedProperties.length > 0 && + selectedAutocompleteIndex < suggestedProperties.length && + selectedAutocompleteIndex >= 0 + ) { + onAcceptSuggestion( + suggestedProperties[selectedAutocompleteIndex].value, + ); + } + } + if (e.key === 'ArrowDown' && e.target instanceof HTMLInputElement) { + if (suggestedProperties.length > 0) { + setSelectedAutocompleteIndex( + Math.min( + selectedAutocompleteIndex + 1, + suggestedProperties.length - 1, + suggestionsLimit - 1, + ), + ); + } + } + if (e.key === 'ArrowUp' && e.target instanceof HTMLInputElement) { + if (suggestedProperties.length > 0) { + setSelectedAutocompleteIndex( + Math.max(selectedAutocompleteIndex - 1, 0), + ); + } + } + }} + /> + {isSearchInputFocused && showHotkey ? ( + +
+ {'/'} +
+
+ ) : null} +
+
+ ); +} diff --git a/packages/app/src/ChartPage.tsx b/packages/app/src/ChartPage.tsx new file mode 100644 index 00000000..fdc661f0 --- /dev/null +++ b/packages/app/src/ChartPage.tsx @@ -0,0 +1,291 @@ +import Head from 'next/head'; +import { Button } from 'react-bootstrap'; +import { useQueryParam, StringParam, withDefault } from 'use-query-params'; +import { useState } from 'react'; +import { encodeArray, decodeArray } from 'serialize-query-params'; +import produce from 'immer'; + +import { useQueryParam as useHDXQueryParam } from './useQueryParam'; +import SearchTimeRangePicker, { + parseTimeRangeInput, +} from './SearchTimeRangePicker'; +import DSSelect from './DSSelect'; +import AppNav from './AppNav'; + +import HDXLineChart from './HDXLineChart'; +import { ChartSeries, AggFn, ChartSeriesForm } from './ChartUtils'; + +import type { QueryParamConfig } from 'serialize-query-params'; +import { LogTableWithSidePanel } from './LogTableWithSidePanel'; +import { parseTimeQuery, useTimeQuery } from './timeQuery'; +import { toast } from 'react-toastify'; + +export const ChartSeriesParam: QueryParamConfig = { + encode: ( + chartSeries: ChartSeries[] | undefined, + ): (string | null)[] | null | undefined => { + return encodeArray(chartSeries?.map(chart => JSON.stringify(chart))); + }, + decode: ( + input: string | (string | null)[] | null | undefined, + ): ChartSeries[] | undefined => { + // TODO: Validation + return decodeArray(input)?.flatMap(series => + series != null ? [JSON.parse(series)] : [], + ); + }, +}; + +// TODO: This is a hack to set the default time range +const defaultTimeRange = parseTimeQuery('Past 1h', false); +export default function GraphPage() { + const labelWidth = 350; + + const [chartSeries, setChartSeries] = useHDXQueryParam( + 'series', + [ + { + table: 'logs', + type: 'time', + aggFn: 'count', + field: undefined, + where: '', + groupBy: [], + }, + ], + { + queryParamConfig: ChartSeriesParam, + }, + ); + + const setTable = (index: number, table: string) => { + setChartSeries( + produce(chartSeries, series => { + if (series?.[index] != null) { + series[index].table = table; + } + }), + ); + }; + + const setAggFn = (index: number, fn: AggFn) => { + setChartSeries( + produce(chartSeries, series => { + if (series?.[index] != null) { + series[index].aggFn = fn; + } + }), + ); + }; + const setField = (index: number, field: string | undefined) => { + setChartSeries( + produce(chartSeries, series => { + if (series?.[index] != null) { + series[index].field = field; + } + }), + ); + }; + const setWhere = (index: number, where: string) => { + setChartSeries( + produce(chartSeries, series => { + if (series?.[index] != null) { + series[index].where = where; + } + }), + ); + }; + const setGroupBy = (index: number, groupBy: string | undefined) => { + setChartSeries( + produce(chartSeries, series => { + if (series?.[index] != null) { + series[index].groupBy = groupBy != null ? [groupBy] : []; + } + }), + ); + }; + + const [granularity, setGranularity] = useQueryParam< + | '30 second' + | '1 minute' + | '5 minute' + | '10 minute' + | '30 minute' + | '1 hour' + | '2 hour' + | '12 hour' + | '1 day' + | '7 day' + | undefined + >('granularity', withDefault(StringParam, '5 minute') as any, { + updateType: 'pushIn', + }); + const [chartConfig, setChartConfig] = useState(); + + const { displayedTimeInputValue, setDisplayedTimeInputValue, onSearch } = + useTimeQuery({ + isUTC: false, + defaultValue: 'Past 1h', + defaultTimeRange: [ + defaultTimeRange?.[0]?.getTime() ?? -1, + defaultTimeRange?.[1]?.getTime() ?? -1, + ], + }); + + const onRunQuery = () => { + onSearch(displayedTimeInputValue); + const dateRange = parseTimeRangeInput(displayedTimeInputValue); + + if (dateRange[0] != null && dateRange[1] != null) { + setChartConfig({ + // TODO: Support multiple series + table: chartSeries[0].table ?? 'logs', + aggFn: chartSeries[0].aggFn, + field: chartSeries[0].field, + where: chartSeries[0].where, + groupBy: chartSeries[0].groupBy[0], + granularity: granularity ?? '5 minute', // TODO: Auto granularity + dateRange, + }); + } else { + toast.error('Invalid time range'); + } + }; + + return ( +
+ + Chart Explorer - HyperDX + + +
+
e.preventDefault()}> +
Create New Chart
+ {chartSeries.map((series, index) => { + return ( + setTable(index, table)} + setWhere={where => setWhere(index, where)} + setAggFn={fn => setAggFn(index, fn)} + setGroupBy={groupBy => setGroupBy(index, groupBy)} + setField={field => setField(index, field)} + /> + ); + })} +
+
+ Time Range +
+
+ { + setDisplayedTimeInputValue(range); + }} + /> +
+
+ +
+
+
+ +
+ +
+ {chartConfig != null && } +
+ {chartConfig != null && chartConfig.table === 'logs' && ( +
+
Sample Matched Events
+
+ {}} + onPropertySearchClick={() => {}} + /> +
+
+ )} +
+
+ ); +} diff --git a/packages/app/src/ChartUtils.tsx b/packages/app/src/ChartUtils.tsx new file mode 100644 index 00000000..394a9d10 --- /dev/null +++ b/packages/app/src/ChartUtils.tsx @@ -0,0 +1,564 @@ +import { Form, InputGroup } from 'react-bootstrap'; +import { useMemo, useRef } from 'react'; +import Select from 'react-select'; +import AsyncSelect from 'react-select/async'; + +import api from './api'; +import { add } from 'date-fns'; +import SearchInput from './SearchInput'; +import MetricTagFilterInput from './MetricTagFilterInput'; + +export const SORT_ORDER = [ + { value: 'asc' as const, label: 'Ascending' }, + { value: 'desc' as const, label: 'Descending' }, +]; +export type SortOrder = (typeof SORT_ORDER)[number]['value']; + +export const TABLES = [ + { value: 'logs' as const, label: 'Logs / Spans' }, + { value: 'metrics' as const, label: 'Metrics' }, +]; + +export const AGG_FNS = [ + { value: 'count' as const, label: 'Count of Events' }, + { value: 'sum' as const, label: 'Sum' }, + { value: 'p99' as const, label: '99th Percentile' }, + { value: 'p95' as const, label: '95th Percentile' }, + { value: 'p90' as const, label: '90th Percentile' }, + { value: 'p50' as const, label: 'Median' }, + { value: 'avg' as const, label: 'Average' }, + { value: 'max' as const, label: 'Maximum' }, + { value: 'min' as const, label: 'Minimum' }, + { value: 'count_distinct' as const, label: 'Count Distinct' }, +]; + +export const METRIC_AGG_FNS = [ + { value: 'sum' as const, label: 'Sum' }, + { value: 'p99' as const, label: '99th Percentile' }, + { value: 'p95' as const, label: '95th Percentile' }, + { value: 'p90' as const, label: '90th Percentile' }, + { value: 'p50' as const, label: 'Median' }, + { value: 'avg' as const, label: 'Average' }, + { value: 'max' as const, label: 'Maximum' }, + { value: 'min' as const, label: 'Minimum' }, +]; + +export type Granularity = + | '30 second' + | '1 minute' + | '5 minute' + | '10 minute' + | '15 minute' + | '30 minute' + | '1 hour' + | '2 hour' + | '6 hour' + | '12 hour' + | '1 day' + | '2 day' + | '7 day' + | '30 day'; + +export type ChartSeries = { + table: string; + type: 'time'; + aggFn: AggFn; + field: string | undefined; + where: string; + groupBy: string[]; +}; + +export function usePropertyOptions(types: ('number' | 'string' | 'bool')[]) { + const { data: propertyTypeMappingsResult } = api.usePropertyTypeMappings(); + const propertyTypeMappings = useMemo(() => { + const mapping = new Map(propertyTypeMappingsResult); + + // TODO: handle special properties somehow better... + mapping.set('level', 'string'); + mapping.set('service', 'string'); + mapping.set('trace_id', 'string'); + mapping.set('span_id', 'string'); + mapping.set('parent_span_id', 'string'); + mapping.set('span_name', 'string'); + mapping.set('duration', 'number'); + mapping.set('body', 'string'); + + return mapping; + }, [propertyTypeMappingsResult]); + + // Blindly consume mappings so we keep the same API/shape as search + const propertyOptions = useMemo(() => { + return Array.from(propertyTypeMappings.entries()) + .flatMap(([key, value]) => + types.includes(value) + ? [ + { + value: key as string, + label: `${key} (${value})`, + }, + ] + : [], + ) + .sort((a, b) => a.value.length - b.value.length); // Prioritize shorter properties (likely to be less nested) + }, [propertyTypeMappings, types]); + + return propertyOptions; +} + +export function MetricTagSelect({ + value, + setValue, + metricName, +}: { + value: string | undefined | null; + setValue: (value: string | undefined) => void; + metricName: string | undefined; +}) { + const { data: metricTagsData } = api.useMetricsTags(); + + const options = useMemo(() => { + const tags = + metricTagsData?.data?.filter(metric => metric.name === metricName)?.[0] + ?.tags ?? []; + + const tagNameSet = new Set(); + + tags.forEach(tag => { + Object.keys(tag).forEach(tagName => tagNameSet.add(tagName)); + }); + + return [ + { value: undefined, label: 'None' }, + ...Array.from(tagNameSet).map(tagName => ({ + value: tagName, + label: tagName, + })), + ]; + }, [metricTagsData, metricName]); + + return ( + { + return Promise.resolve( + options.filter(v => + input.length > 0 + ? (v.value ?? 'None').toLowerCase().includes(input.toLowerCase()) + : true, + ), + ); + }} + defaultOptions={options} + value={ + value != null + ? options.find(v => v.value === value) + : { value: undefined, label: 'None' } + } + onChange={opt => setValue(opt?.value)} + className="ds-select" + classNamePrefix="ds-react-select" + /> + ); +} + +export function MetricNameSelect({ + value, + setValue, +}: { + value: string | undefined | null; + setValue: (value: string | undefined) => void; +}) { + const { data: metricTagsData } = api.useMetricsTags(); + + const options = useMemo(() => { + return ( + metricTagsData?.data?.map(entry => ({ + value: entry.name, + label: entry.name, + })) ?? [] + ); + }, [metricTagsData]); + + return ( + { + return Promise.resolve( + options.filter(v => + input.length > 0 + ? v.value.toLowerCase().includes(input.toLowerCase()) + : true, + ), + ); + }} + defaultOptions={options} + value={ + value != null + ? options.find(v => v.value === value) + : { value: undefined, label: 'None' } + } + onChange={opt => setValue(opt?.value)} + className="ds-select" + classNamePrefix="ds-react-select" + /> + ); +} + +export function FieldSelect({ + value, + setValue, + types, + className, +}: { + value: string | undefined | null; + setValue: (value: string | undefined) => void; + types: ('number' | 'string' | 'bool')[]; + className?: string; +}) { + const propertyOptions = usePropertyOptions(types); + + return ( + { + return Promise.resolve([ + { value: undefined, label: 'None' }, + ...propertyOptions + .filter(v => + input.length > 0 + ? v.value.toLowerCase().includes(input.toLowerCase()) + : true, + ) + .slice(0, 1000), // TODO: better surface too many results... somehow? + ]); + }} + defaultOptions={[ + { value: undefined, label: 'None' }, + ...propertyOptions + // Filter out index properties on initial dropdown + .filter(v => v.value.match(/\.\d+(\.|$)/) == null) + .slice(0, 1000), // TODO: better surface too many results... somehow? + ]} + value={ + value != null + ? propertyOptions.find(v => v.value === value) + : { value: undefined, label: 'None' } + } + onChange={opt => setValue(opt?.value)} + className={`ds-select ${className ?? ''}`} + classNamePrefix="ds-react-select" + /> + ); +} + +export type AggFn = (typeof AGG_FNS)[number]['value']; + +export function ChartSeriesForm({ + sortOrder, + table, + aggFn, + where, + field, + groupBy, + setSortOrder, + setTable, + setAggFn, + setWhere, + setField, + setGroupBy, +}: { + sortOrder?: string; + table: string; + aggFn: AggFn; + where: string; + field: string | undefined; + groupBy: string | undefined; + setTable: (table: string) => void; + setAggFn: (fn: AggFn) => void; + setWhere: (where: string) => void; + setField: (field: string | undefined) => void; + setGroupBy: (groupBy: string | undefined) => void; + setSortOrder?: (sortOrder: SortOrder) => void; +}) { + const labelWidth = 350; + const searchInputRef = useRef(null); + + return ( +
+
+
+ v.value === aggFn)} + onChange={opt => setAggFn(opt?.value ?? 'count')} + classNamePrefix="ds-react-select" + /> + ) : ( + v.value === sortOrder)} + onChange={opt => setSortOrder(opt?.value ?? 'desc')} + classNamePrefix="ds-react-select" + /> +
+
+ ) + } +
+ ); +} + +export function convertDateRangeToGranularityString( + dateRange: [Date, Date], + maxNumBuckets: number, +): Granularity { + const start = dateRange[0].getTime(); + const end = dateRange[1].getTime(); + const diffSeconds = Math.floor((end - start) / 1000); + const granularitySizeSeconds = Math.ceil(diffSeconds / maxNumBuckets); + + if (granularitySizeSeconds <= 30) { + return '30 second'; + } else if (granularitySizeSeconds <= 60) { + return '1 minute'; + } else if (granularitySizeSeconds <= 5 * 60) { + return '5 minute'; + } else if (granularitySizeSeconds <= 10 * 60) { + return '10 minute'; + } else if (granularitySizeSeconds <= 15 * 60) { + return '15 minute'; + } else if (granularitySizeSeconds <= 30 * 60) { + return '30 minute'; + } else if (granularitySizeSeconds <= 3600) { + return '1 hour'; + } else if (granularitySizeSeconds <= 2 * 3600) { + return '2 hour'; + } else if (granularitySizeSeconds <= 6 * 3600) { + return '6 hour'; + } else if (granularitySizeSeconds <= 12 * 3600) { + return '12 hour'; + } else if (granularitySizeSeconds <= 24 * 3600) { + return '1 day'; + } else if (granularitySizeSeconds <= 2 * 24 * 3600) { + return '2 day'; + } else if (granularitySizeSeconds <= 7 * 24 * 3600) { + return '7 day'; + } else if (granularitySizeSeconds <= 30 * 24 * 3600) { + return '30 day'; + } + + return '30 day'; +} + +export function convertGranularityToSeconds(granularity: Granularity): number { + const [num, unit] = granularity.split(' '); + const numInt = Number.parseInt(num); + switch (unit) { + case 'second': + return numInt; + case 'minute': + return numInt * 60; + case 'hour': + return numInt * 60 * 60; + case 'day': + return numInt * 60 * 60 * 24; + default: + return 0; + } +} + +// Note: roundToNearestMinutes is broken in date-fns currently +// additionally it doesn't support seconds or > 30min +// so we need to write our own :( +// see: https://github.com/date-fns/date-fns/pull/3267/files +export function toStartOfInterval(date: Date, granularity: Granularity): Date { + const [num, unit] = granularity.split(' '); + const numInt = Number.parseInt(num); + const roundFn = Math.floor; + + switch (unit) { + case 'second': + return new Date( + Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + roundFn(date.getUTCSeconds() / numInt) * numInt, + ), + ); + case 'minute': + return new Date( + Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + roundFn(date.getUTCMinutes() / numInt) * numInt, + ), + ); + case 'hour': + return new Date( + Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + roundFn(date.getUTCHours() / numInt) * numInt, + ), + ); + case 'day': { + // Clickhouse uses the # of days since unix epoch to round dates + // see: https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/DateLUTImpl.h#L1059 + const daysSinceEpoch = date.getTime() / 1000 / 60 / 60 / 24; + const daysSinceEpochRounded = roundFn(daysSinceEpoch / numInt) * numInt; + + return new Date(daysSinceEpochRounded * 1000 * 60 * 60 * 24); + } + default: + return date; + } +} + +export function timeBucketByGranularity( + start: Date, + end: Date, + granularity: Granularity, +): Date[] { + const buckets: Date[] = []; + + let current = toStartOfInterval(start, granularity); + const granularitySeconds = convertGranularityToSeconds(granularity); + while (current < end) { + buckets.push(current); + current = add(current, { + seconds: granularitySeconds, + }); + } + + return buckets; +} diff --git a/packages/app/src/Checkbox.tsx b/packages/app/src/Checkbox.tsx new file mode 100644 index 00000000..19d10da5 --- /dev/null +++ b/packages/app/src/Checkbox.tsx @@ -0,0 +1,36 @@ +export default function Checkbox({ + id, + className, + labelClassName, + checked, + onChange, + label, + disabled, +}: { + id: string; + className?: string; + labelClassName?: string; + checked: boolean; + onChange: () => void; + label: React.ReactNode; + disabled?: boolean; +}) { + return ( + + + + + ); +} diff --git a/packages/app/src/Clipboard.tsx b/packages/app/src/Clipboard.tsx new file mode 100644 index 00000000..2f99a363 --- /dev/null +++ b/packages/app/src/Clipboard.tsx @@ -0,0 +1,33 @@ +import cx from 'classnames'; +import { Button } from 'react-bootstrap'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import { useState } from 'react'; + +export default function Clipboard({ + text, + className, + children, +}: { + text: string; + className?: string; + children: ({ isCopied }: { isCopied: boolean }) => React.ReactNode; +}) { + const [isCopied, setIsCopied] = useState(false); + + return ( + { + setIsCopied(true); + setTimeout(() => setIsCopied(false), 2000); + }} + > + + + ); +} diff --git a/packages/app/src/ControllerSelect.tsx b/packages/app/src/ControllerSelect.tsx new file mode 100644 index 00000000..c489d587 --- /dev/null +++ b/packages/app/src/ControllerSelect.tsx @@ -0,0 +1,36 @@ +import { Controller } from 'react-hook-form'; +import Select from 'react-select'; + +import type { Control } from 'react-hook-form'; + +export default function ControllerSelect< + Option extends { value: string | undefined; label: React.ReactNode }, +>({ + control, + defaultValue, + name, + options, +}: { + options: Option[]; + defaultValue: string | undefined; + name: string; + control: Control; +}) { + return ( + ( + v.value === value)} + onChange={newValue => onChange(newValue?.value)} + classNamePrefix="ds-react-select" + /> + ); +} diff --git a/packages/app/src/DashboardPage.tsx b/packages/app/src/DashboardPage.tsx new file mode 100644 index 00000000..71800604 --- /dev/null +++ b/packages/app/src/DashboardPage.tsx @@ -0,0 +1,934 @@ +import Head from 'next/head'; +import { + ForwardedRef, + forwardRef, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import RGL, { WidthProvider } from 'react-grid-layout'; +import produce from 'immer'; +import HDXMarkdownChart from './HDXMarkdownChart'; +import { Button, Form, Modal } from 'react-bootstrap'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { useRouter } from 'next/router'; +import { useQueryClient } from 'react-query'; +import { toast } from 'react-toastify'; +import { + JsonParam, + StringParam, + useQueryParam, + withDefault, +} from 'use-query-params'; + +import HDXLineChart from './HDXLineChart'; +import AppNav from './AppNav'; +import SearchTimeRangePicker from './SearchTimeRangePicker'; +import { Granularity, convertDateRangeToGranularityString } from './ChartUtils'; +import { FloppyIcon, Histogram } from './SVGIcons'; +import SearchInput from './SearchInput'; +import { hashCode } from './utils'; +import TabBar from './TabBar'; +import HDXHistogramChart from './HDXHistogramChart'; +import api from './api'; +import { LogTableWithSidePanel } from './LogTableWithSidePanel'; +import { parseTimeQuery, useTimeQuery } from './timeQuery'; +import { + EditSearchChartForm, + EditMarkdownChartForm, + EditHistogramChartForm, + EditLineChartForm, + EditNumberChartForm, + EditTableChartForm, +} from './EditChartForm'; +import HDXNumberChart from './HDXNumberChart'; +import GranularityPicker from './GranularityPicker'; +import HDXTableChart from './HDXTableChart'; + +import type { Chart } from './EditChartForm'; + +import 'react-grid-layout/css/styles.css'; +import 'react-resizable/css/styles.css'; +import { ZIndexContext } from './zIndex'; + +const ReactGridLayout = WidthProvider(RGL); + +type Dashboard = { + id: string; + name: string; + charts: Chart[]; + query?: string; +}; + +const buildAndWhereClause = (query1: string, query2: string) => { + if (!query1 && !query2) { + return ''; + } else if (!query1) { + return query2; + } else if (!query2) { + return query1; + } else { + return `${query1} (${query2})`; + } +}; + +const Tile = forwardRef( + ( + { + chart, + dateRange, + onEditClick, + onDeleteClick, + query, + queued, + onSettled, + granularity, + + // Properties forwarded by grid layout + className, + style, + onMouseDown, + onMouseUp, + onTouchEnd, + children, + }: { + chart: Chart; + dateRange: [Date, Date]; + onEditClick: () => void; + onDeleteClick: () => void; + query: string; + onSettled?: () => void; + queued?: boolean; + granularity: Granularity | undefined; + + // Properties forwarded by grid layout + className?: string; + style?: React.CSSProperties; + onMouseDown?: (e: React.MouseEvent) => void; + onMouseUp?: (e: React.MouseEvent) => void; + onTouchEnd?: (e: React.TouchEvent) => void; + children?: React.ReactNode; // Resizer tooltip + }, + ref: ForwardedRef, + ) => { + const config = useMemo(() => { + const type = chart.series[0].type; + return type === 'time' + ? { + type, + table: chart.series[0].table ?? 'logs', + aggFn: chart.series[0].aggFn, + field: chart.series[0].field ?? '', // TODO: Fix in definition + groupBy: chart.series[0].groupBy[0], + where: buildAndWhereClause(query, chart.series[0].where), + granularity: + granularity ?? convertDateRangeToGranularityString(dateRange, 60), + dateRange, + } + : type === 'table' + ? { + type, + table: chart.series[0].table ?? 'logs', + aggFn: chart.series[0].aggFn, + field: chart.series[0].field ?? '', // TODO: Fix in definition + groupBy: chart.series[0].groupBy[0], + sortOrder: chart.series[0].sortOrder ?? 'desc', // TODO: Centralize this maybe? + where: buildAndWhereClause(query, chart.series[0].where), + granularity: + granularity ?? convertDateRangeToGranularityString(dateRange, 60), + dateRange, + } + : type === 'histogram' + ? { + type, + table: chart.series[0].table ?? 'logs', + field: chart.series[0].field ?? '', // TODO: Fix in definition + where: buildAndWhereClause(query, chart.series[0].where), + dateRange, + } + : type === 'markdown' + ? { + type, + content: chart.series[0].content, + } + : type === 'number' + ? { + type, + table: chart.series[0].table ?? 'logs', + aggFn: chart.series[0].aggFn, + field: chart.series[0].field ?? '', // TODO: Fix in definition + where: buildAndWhereClause(query, chart.series[0].where), + dateRange, + } + : { + type, + fields: chart.series[0].fields ?? [], + where: buildAndWhereClause(query, chart.series[0].where), + dateRange, + }; + }, [query, chart, dateRange, granularity]); + + // Markdown doesn't have an onSettled function + useEffect(() => { + if (config.type === 'markdown') { + onSettled?.(); + } + }, [config.type, onSettled]); + + return ( +
+
+
{chart.name}
+ +
+ + +
+
+ {queued === true ? ( +
+ Waiting for other queries to finish... +
+ ) : ( +
e.stopPropagation()} + > + {config.type === 'time' && ( + + )} + {config.type === 'table' && ( + + )} + {config.type === 'histogram' && ( + + )} + {config.type === 'markdown' && } + {config.type === 'number' && ( + + )} + {config.type === 'search' && ( +
+ {}} + onPropertySearchClick={() => {}} + onSettled={onSettled} + /> +
+ )} +
+ )} + {children} +
+ ); + }, +); + +const EditChartModal = ({ + chart, + dateRange, + onSave, + show, + onClose, +}: { + chart: Chart | undefined; + dateRange: [Date, Date]; + onSave: (chart: Chart) => void; + onClose: () => void; + show: boolean; +}) => { + const [tab, setTab] = useState< + | 'time' + | 'search' + | 'histogram' + | 'markdown' + | 'number' + | 'table' + | undefined + >(undefined); + const displayedTab = tab ?? chart?.series?.[0]?.type ?? 'time'; + + return ( + + + + + Line Chart + + ), + value: 'time', + }, + { + text: ( + + Search Results + + ), + value: 'search', + }, + { + text: ( + + Table + + ), + value: 'table', + }, + { + text: ( + + Histogram + + ), + value: 'histogram', + }, + { + text: ( + + Number + + ), + value: 'number', + }, + { + text: ( + + Markdown + + ), + value: 'markdown', + }, + ]} + activeItem={displayedTab} + onClick={v => { + setTab(v); + }} + /> + {displayedTab === 'time' && chart != null && ( + { + draft.series[0].type = 'time'; + })} + onSave={onSave} + onClose={onClose} + dateRange={dateRange} + /> + )} + {displayedTab === 'table' && chart != null && ( + { + draft.series[0].type = 'table'; + })} + onSave={onSave} + onClose={onClose} + dateRange={dateRange} + /> + )} + {displayedTab === 'histogram' && chart != null && ( + { + draft.series[0].type = 'histogram'; + })} + onSave={onSave} + onClose={onClose} + dateRange={dateRange} + /> + )} + {displayedTab === 'search' && chart != null && ( + { + draft.series[0].type = 'search'; + })} + onSave={onSave} + onClose={onClose} + dateRange={dateRange} + /> + )} + {displayedTab === 'number' && chart != null && ( + { + draft.series[0].type = 'number'; + })} + onSave={onSave} + onClose={onClose} + dateRange={dateRange} + /> + )} + {displayedTab === 'markdown' && chart != null && ( + { + draft.series[0].type = 'markdown'; + })} + onSave={onSave} + onClose={onClose} + /> + )} + + + + ); +}; + +const updateLayout = (newLayout: RGL.Layout[]) => { + return (dashboard: Dashboard) => { + for (const chart of dashboard.charts) { + const newChartLayout = newLayout.find(layout => layout.i === chart.id); + if (newChartLayout) { + chart.x = newChartLayout.x; + chart.y = newChartLayout.y; + chart.w = newChartLayout.w; + chart.h = newChartLayout.h; + } + } + }; +}; + +function DashboardName({ + name, + onSave, +}: { + name: string; + onSave: (name: string) => void; +}) { + const [editing, setEditing] = useState(false); + const [editedName, setEditedName] = useState(name); + + return ( + <> + {editing ? ( +
{ + e.preventDefault(); + onSave(editedName); + setEditing(false); + }} + > + setEditedName(e.target.value)} + placeholder="Dashboard Name" + /> + + + ) : ( +
+
+ {name} +
+ setEditing(true)} + > + + +
+ )} + + ); +} + +function DashboardFilter({ + onSave, + onSubmit, + dashboardQuery, +}: { + onSubmit: (query: string) => void; + onSave: (query: string) => void; + dashboardQuery: string; +}) { + const inputRef = useRef(null); + const [inputQuery, setInputQuery] = useState(dashboardQuery); + + useHotkeys( + '/', + () => { + inputRef.current?.focus(); + }, + { preventDefault: true }, + [inputRef], + ); + + return ( +
{ + e.preventDefault(); + onSubmit(inputQuery); + }} + > + setInputQuery(value)} + onSearch={() => {}} + placeholder="Filter charts by service, property, etc." + /> + + + + ); +} + +// TODO: This is a hack to set the default time range +const defaultTimeRange = parseTimeQuery('Past 1h', false); +export default function DashboardPage() { + const { data: dashboardsData, isLoading: isDashboardsLoading } = + api.useDashboards(); + const updateDashboard = api.useUpdateDashboard(); + const createDashboard = api.useCreateDashboard(); + const router = useRouter(); + const { dashboardId, config } = router.query; + const queryClient = useQueryClient(); + + const [localDashboard, setLocalDashboard] = useQueryParam( + 'config', + withDefault(JsonParam, { + id: '', + name: 'My New Dashboard', + charts: [], + query: '', + }), + { updateType: 'pushIn', enableBatching: true }, + ); + + const isLocalDashboard = dashboardId == null; + const dashboardHash = + dashboardId != null ? dashboardId : hashCode(`${config}`); + + const dashboard: Dashboard | undefined = useMemo(() => { + if (isLocalDashboard) { + return localDashboard; + } + if (dashboardsData != null) { + const matchedDashboard = dashboardsData.data.find( + (d: any) => d._id === dashboardId, + ); + return matchedDashboard; + } + }, [dashboardsData, dashboardId, isLocalDashboard, localDashboard]); + + // Update dashboard + const setDashboard = useCallback( + (newDashboard: Dashboard) => { + if (isLocalDashboard) { + setLocalDashboard(newDashboard); + } else { + updateDashboard.mutate( + { + id: `${dashboardId}`, + name: newDashboard.name, + charts: newDashboard.charts, + query: newDashboard.query ?? '', + }, + { + onSuccess: () => { + queryClient.invalidateQueries(['dashboards']); + }, + }, + ); + } + }, + [ + dashboardId, + updateDashboard, + queryClient, + isLocalDashboard, + setLocalDashboard, + ], + ); + + const [searchedQuery, setSearchedQuery] = useQueryParam( + 'q', + withDefault(StringParam, undefined), + ); + + const [granularityQuery, setGranularityQuery] = useQueryParam( + 'granularity', + withDefault( + // TODO: Validate? + StringParam as any, + undefined, + ), + ); + + const dashboardQuery = searchedQuery ?? dashboard?.query ?? ''; + + const deleteDashboard = api.useDeleteDashboard(); + + const [editedChart, setEditedChart] = useState(); + + const { + searchedTimeRange, + displayedTimeInputValue, + setDisplayedTimeInputValue, + onSearch, + } = useTimeQuery({ + isUTC: false, + defaultValue: 'Past 1h', + defaultTimeRange: [ + defaultTimeRange?.[0]?.getTime() ?? -1, + defaultTimeRange?.[1]?.getTime() ?? -1, + ], + }); + + const onAddChart = () => { + setEditedChart({ + id: '', + name: 'My New Chart', + x: 0, + y: 0, + w: 4, + h: 2, + series: [ + { + table: 'logs', + type: 'time', + aggFn: 'count', + field: undefined, + where: '', + groupBy: [], + }, + ], + }); + }; + + // Open new chart modal if it's a temp dashboard with 0 charts created + useEffect(() => { + if (isLocalDashboard && router.isReady && dashboard?.charts.length === 0) { + onAddChart(); + } + }, [isLocalDashboard, router, dashboard?.charts.length]); + + const tiles = useMemo( + () => + (dashboard?.charts ?? []).map(chart => { + return ( + setEditedChart(chart)} + granularity={granularityQuery} + onDeleteClick={() => { + if (dashboard != null) { + setDashboard({ + ...dashboard, + charts: dashboard.charts.filter(c => c.id !== chart.id), + }); + } + }} + /> + ); + }), + [ + dashboard, + searchedTimeRange, + setDashboard, + dashboardQuery, + granularityQuery, + ], + ); + + const layout = (dashboard?.charts ?? []).map(chart => { + return { + i: chart.id, + x: chart.x, + y: chart.y, + w: chart.w, + h: chart.h, + minH: 2, + minW: 3, + }; + }); + + return ( +
+ + Dashboard - HyperDX + + + {dashboard != null ? ( + setEditedChart(undefined)} + onSave={newChart => { + setDashboard( + produce(dashboard, draft => { + const chartIndex = draft.charts.findIndex( + chart => chart.id === newChart.id, + ); + if (chartIndex === -1) { + // This is a new chart (probably?) + draft.charts.push({ + ...newChart, + id: Math.floor(100000000 * Math.random()).toString(36), + }); + } else { + draft.charts[chartIndex] = newChart; + } + }), + ); + setEditedChart(undefined); + }} + /> + ) : null} +
+
+ {dashboard != null && ( +
+ + setDashboard({ + ...dashboard, + name: editedName, + }) + } + /> + {isLocalDashboard && ( + (Unsaved Dashboard) + )} +
+ )} +
+
+
{ + e.preventDefault(); + onSearch(displayedTimeInputValue); + }} + style={{ height: 33 }} + > + { + onSearch(range); + }} + /> +
+ +
+ + +
+ + {isLocalDashboard ? ( + + ) : ( + + )} +
+
+ {dashboard != null && ( +
+ { + setDashboard({ + ...dashboard, + query, + }); + setSearchedQuery(undefined); + toast.success('Dashboard filter saved and applied.'); + }} + onSubmit={query => { + setSearchedQuery(query); + }} + /> +
+ )} + {isDashboardsLoading && ( +
+ Loading Dashboard... +
+ )} + {dashboard?.charts.length === 0 && ( +
+ No charts added yet. Click the {'"'}Add Chart{'"'} button to get + started. +
+ )} + {dashboard != null && dashboard.charts != null ? ( + { + // compare x, y, h, w between newLayout and layout to see if anything has changed + // if so, update the dashboard + // this will prevent spurious updates to the dashboard, + // that messes with router/URL state due to + // qparam being used to store dashboard state + // also it reduced network requests + let hasDiff = false; + if (newLayout.length !== layout.length) { + hasDiff = true; + } else { + for (let i = 0; i < newLayout.length; i++) { + const curr = newLayout[i]; + const oldLayout = layout.find(l => l.i === curr.i); + if ( + oldLayout?.x !== curr.x || + oldLayout?.y !== curr.y || + oldLayout?.h !== curr.h || + oldLayout?.w !== curr.w + ) { + hasDiff = true; + break; + } + } + } + + if (hasDiff) { + setDashboard(produce(dashboard, updateLayout(newLayout))); + } + }} + cols={12} + rowHeight={160} + > + {tiles} + + ) : null} +
+
+ ); +} diff --git a/packages/app/src/Dropdown.tsx b/packages/app/src/Dropdown.tsx new file mode 100644 index 00000000..d3a718fd --- /dev/null +++ b/packages/app/src/Dropdown.tsx @@ -0,0 +1,37 @@ +import { Form } from 'react-bootstrap'; + +export default function Dropdown({ + className, + disabled, + onChange, + options, + style, + value, +}: { + className?: string; + disabled?: boolean; + onChange: (value: T) => any; + options: Array<{ value: T; text: string }>; + style?: { [key: string]: any }; + value: T | undefined; +}) { + return ( + = 0 ? '' : 'bg-body' + } w-auto ${className ?? ''}`} + value={value} + style={style} + onChange={e => onChange(e.target.value as T)} + title={options.find(opt => opt.value === value)?.text ?? ''} + > + {options.map(option => ( + + ))} + + ); +} diff --git a/packages/app/src/EditChartForm.tsx b/packages/app/src/EditChartForm.tsx new file mode 100644 index 00000000..56a48ed0 --- /dev/null +++ b/packages/app/src/EditChartForm.tsx @@ -0,0 +1,952 @@ +import { useMemo, useState } from 'react'; +import produce from 'immer'; +import HDXMarkdownChart from './HDXMarkdownChart'; +import Select from 'react-select'; +import { Button, Form, InputGroup, Modal } from 'react-bootstrap'; + +import HDXLineChart from './HDXLineChart'; +import { + AGG_FNS, + AggFn, + ChartSeriesForm, + FieldSelect, + convertDateRangeToGranularityString, +} from './ChartUtils'; +import { hashCode, useDebounce } from './utils'; +import HDXHistogramChart from './HDXHistogramChart'; +import { LogTableWithSidePanel } from './LogTableWithSidePanel'; + +import HDXNumberChart from './HDXNumberChart'; +import HDXTableChart from './HDXTableChart'; + +export type Chart = { + id: string; + name: string; + x: number; + y: number; + w: number; + h: number; + series: ( + | { + table: string; + type: 'time'; + aggFn: AggFn; // TODO: Type + field: string | undefined; + where: string; + groupBy: string[]; + } + | { + table: string; + type: 'histogram'; + field: string | undefined; + where: string; + } + | { + type: 'search'; + fields: string[]; + where: string; + } + | { + type: 'number'; + table: string; + aggFn: AggFn; + field: string | undefined; + where: string; + } + | { + type: 'table'; + table: string; + aggFn: AggFn; + field: string | undefined; + where: string; + groupBy: string[]; + sortOrder: 'desc' | 'asc'; + } + | { + type: 'markdown'; + content: string; + } + )[]; +}; + +export const EditMarkdownChartForm = ({ + chart, + onClose, + onSave, +}: { + chart: Chart | undefined; + onSave: (chart: Chart) => void; + onClose: () => void; +}) => { + const [editedChart, setEditedChart] = useState(chart); + + const chartConfig = useMemo(() => { + return editedChart != null && editedChart.series[0].type === 'markdown' + ? { + content: editedChart.series[0].content, + } + : null; + }, [editedChart]); + const previewConfig = chartConfig; + + if ( + chartConfig == null || + editedChart == null || + previewConfig == null || + editedChart.series[0].type !== 'markdown' + ) { + return null; + } + + const labelWidth = 320; + + return ( +
{ + e.preventDefault(); + onSave(editedChart); + }} + > +
Markdown
+
+ + setEditedChart( + produce(editedChart, draft => { + draft.name = e.target.value; + }), + ) + } + defaultValue={editedChart.name} + placeholder="Title" + /> +
+
+
+ Content +
+
+ + + setEditedChart( + produce(editedChart, draft => { + if (draft.series[0].type === 'markdown') { + draft.series[0].content = event.target.value; + } + }), + ) + } + /> + +
+
+
+ + +
+
+
Markdown Preview
+
+ +
+
+
+ ); +}; + +export const EditSearchChartForm = ({ + chart, + onClose, + onSave, + dateRange, +}: { + chart: Chart | undefined; + dateRange: [Date, Date]; + onSave: (chart: Chart) => void; + onClose: () => void; +}) => { + const [editedChart, setEditedChart] = useState(chart); + + const chartConfig = useMemo(() => { + return editedChart != null && editedChart.series[0].type === 'search' + ? { + where: editedChart.series[0].where, + dateRange, + } + : null; + }, [editedChart, dateRange]); + const previewConfig = useDebounce(chartConfig, 500); + + if ( + chartConfig == null || + editedChart == null || + previewConfig == null || + editedChart.series[0].type !== 'search' + ) { + return null; + } + + const labelWidth = 320; + + return ( +
{ + e.preventDefault(); + onSave(editedChart); + }} + > +
Search Builder
+
+ + setEditedChart( + produce(editedChart, draft => { + draft.name = e.target.value; + }), + ) + } + defaultValue={editedChart.name} + placeholder="Chart Name" + /> +
+
+
+ Search Query +
+
+ + + setEditedChart( + produce(editedChart, draft => { + if (draft.series[0].type === 'search') { + draft.series[0].where = event.target.value; + } + }), + ) + } + /> + +
+
+
+ + +
+
+
Search Preview
+
+ {}} + onPropertySearchClick={() => {}} + /> +
+
+
+ ); +}; + +export const EditNumberChartForm = ({ + chart, + onClose, + onSave, + dateRange, +}: { + chart: Chart | undefined; + dateRange: [Date, Date]; + onSave: (chart: Chart) => void; + onClose: () => void; +}) => { + const [editedChart, setEditedChart] = useState(chart); + + const chartConfig = useMemo(() => { + return editedChart != null && editedChart.series[0].type === 'number' + ? { + aggFn: editedChart.series[0].aggFn ?? 'count', + table: editedChart.series[0].table ?? 'logs', + field: editedChart.series[0].field ?? '', // TODO: Fix in definition + where: editedChart.series[0].where, + dateRange, + } + : null; + }, [editedChart, dateRange]); + const previewConfig = useDebounce(chartConfig, 500); + + if ( + chartConfig == null || + editedChart == null || + previewConfig == null || + editedChart.series[0].type !== 'number' + ) { + return null; + } + + const labelWidth = 320; + const aggFn = editedChart.series[0].aggFn ?? 'count'; + + return ( +
{ + e.preventDefault(); + onSave(editedChart); + }} + > +
Number Tile Builder
+
+ + setEditedChart( + produce(editedChart, draft => { + draft.name = e.target.value; + }), + ) + } + defaultValue={editedChart.name} + placeholder="Chart Name" + /> +
+
+
+ Aggregation Function +
+
+ + + { + setShowSaveSearchModal(true); + }} + /> +
+
+
+ {isReady ? ( + + ) : null} +
+ +
+
+ {/* Hack, recharts will release real fix soon https://github.com/recharts/recharts/issues/172 */} +
+
+ {isReady ? ( + + ) : null} +
+
+
+ {shouldShowLiveModeHint && resultsMode === 'search' && ( +
+
+ +
+
+ )} +
+ {isReady ? ( + resultsMode === 'search' || isLive ? ( + { + setIsLive(false); + setResultsMode('patterns'); + }} + /> + ) : ( + + ) + ) : null} +
+
+ + ); +} diff --git a/packages/app/src/SearchPageActionBar.tsx b/packages/app/src/SearchPageActionBar.tsx new file mode 100644 index 00000000..3d96ed08 --- /dev/null +++ b/packages/app/src/SearchPageActionBar.tsx @@ -0,0 +1,167 @@ +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; +import { Button } from 'react-bootstrap'; +import { useState } from 'react'; + +import { FloppyIcon } from './SVGIcons'; +import { useWindowSize } from './utils'; + +export default function SearchPageActionBar({ + onClickConfigAlert, + onClickDeleteLogView, + onClickSaveSearch, + onClickUpdateLogView, + selectedLogView, +}: { + onClickConfigAlert: () => void; + onClickDeleteLogView: () => void; + onClickSaveSearch: () => void; + onClickUpdateLogView: () => void; + selectedLogView: any; +}) { + const { width } = useWindowSize(); + const [isMoreActionsOpen, setIsMoreActionsOpen] = useState(false); + const isSmallScreen = (width ?? 1000) < 900; + + return ( + <> + {!selectedLogView && !isSmallScreen && ( + + )} + {selectedLogView && !isSmallScreen && ( + + )} + {!isSmallScreen && ( + + )} + {(selectedLogView || isSmallScreen) && ( + setIsMoreActionsOpen(opened)} + show={isMoreActionsOpen} + placement="bottom-end" + delay={{ show: 0, hide: 0 }} + trigger={['click']} + overlay={ +
+ {isSmallScreen && ( + <> + {!selectedLogView && ( +
+ +
+ )} + {selectedLogView && ( +
+ +
+ )} + + )} + {isSmallScreen && ( +
+ +
+ )} + {selectedLogView && ( + <> +
+ +
+
+ +
+ + )} +
+ } + > + +
+ )} + + ); +} diff --git a/packages/app/src/SearchTimeRangePicker.tsx b/packages/app/src/SearchTimeRangePicker.tsx new file mode 100644 index 00000000..2a7d60b7 --- /dev/null +++ b/packages/app/src/SearchTimeRangePicker.tsx @@ -0,0 +1,216 @@ +import { Form, InputGroup } from 'react-bootstrap'; +import cx from 'classnames'; +import { useRef, useEffect, useState } from 'react'; +import DatePicker from 'react-datepicker'; +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; +import { endOfDay, format, sub } from 'date-fns'; +import * as chrono from 'chrono-node'; + +import 'react-datepicker/dist/react-datepicker.css'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { TimeFormat } from './useUserPreferences'; + +export function parseTimeRangeInput(str: string): [Date | null, Date | null] { + const parsedTimeResult = chrono.parse(str); + const start = + parsedTimeResult.length === 1 + ? parsedTimeResult[0].start?.date() + : parsedTimeResult.length > 1 + ? parsedTimeResult[1].start?.date() + : null; + const end = + parsedTimeResult.length === 1 && parsedTimeResult[0].end != null + ? parsedTimeResult[0].end.date() + : parsedTimeResult.length > 1 && parsedTimeResult[1].end != null + ? parsedTimeResult[1].end.date() + : start != null && start instanceof Date + ? new Date() + : null; + + return [start, end]; +} + +const LIVE_TAIL_TIME_QUERY = 'Live Tail'; + +export default function SearchTimeRangePicker({ + inputValue, + setInputValue, + onSearch, + showLive = false, + timeFormat = '24h', +}: { + inputValue: string; + setInputValue: (str: string) => any; + onSearch: (rangeStr: string) => void; + showLive?: boolean; + timeFormat?: TimeFormat; +}) { + const inputRef = useRef(null); + + const [dateRange, setDateRange] = useState<[Date | null, Date | null]>([ + null, + null, + ]); + + const [isDatePickerOpen, setIsDatePickerOpen] = useState(false); + useHotkeys( + 'd', + () => { + setIsDatePickerOpen(true); + }, + { preventDefault: true }, + [setIsDatePickerOpen], + ); + + useEffect(() => { + if (isDatePickerOpen) { + inputRef.current?.focus(); + } + }, [isDatePickerOpen]); + + return ( + <> + setIsDatePickerOpen(opened)} + show={isDatePickerOpen} + placement="bottom" + delay={{ show: 0, hide: 0 }} + overlay={ +
{ + if (e.key === 'Enter') { + e.stopPropagation(); + setIsDatePickerOpen(false); + } + }} + > +
+
+
Preset Ranges
+ {showLive ? ( +
{ + setInputValue(LIVE_TAIL_TIME_QUERY); + onSearch(LIVE_TAIL_TIME_QUERY); + setIsDatePickerOpen(false); + }} + > + Live Tail +
+ ) : null} + {['15m', '1h', '4h', '12h', '1d', '4d', '7d', '30d'].map( + value => ( +
{ + setInputValue(`Past ${value}`); + onSearch(`Past ${value}`); + setIsDatePickerOpen(false); + }} + > + Past {value} +
+ ), + )} +
+ { + const formatStr = + timeFormat === '24h' ? 'MMM d HH:mm:ss' : 'MMM d h:mm:ss a'; + setDateRange(range); + + if (range != null && range[0] != null) { + const timeStr = `${format(range[0], formatStr)} - ${ + range[1] != null + ? format(endOfDay(range[1]), formatStr) + : '' + }`; + + setInputValue(timeStr); + + if (range[1] != null) { + onSearch(timeStr); + setIsDatePickerOpen(false); + } + } + }} + monthsShown={1} + // calendarContainer={MyContainer} + // showPreviousMonths + // focusSelectedMonth={true} + // monthsShown={2} + /> +
+
+ } + trigger={['click']} + > + + + + + setInputValue(e.target.value)} + onKeyDown={e => { + if (e.key === 'Escape' && e.target instanceof HTMLInputElement) { + e.target.blur(); + } + }} + /> + {inputValue.includes(LIVE_TAIL_TIME_QUERY) && ( + + + + )} + {isDatePickerOpen ? ( + +
+ d +
+
+ ) : null} +
+
+ + ); +} diff --git a/packages/app/src/SessionSidePanel.tsx b/packages/app/src/SessionSidePanel.tsx new file mode 100644 index 00000000..c3a99071 --- /dev/null +++ b/packages/app/src/SessionSidePanel.tsx @@ -0,0 +1,139 @@ +import CopyToClipboard from 'react-copy-to-clipboard'; +import Drawer from 'react-modern-drawer'; +import { Button } from 'react-bootstrap'; +import { toast } from 'react-toastify'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { useState } from 'react'; + +import api from './api'; +import SessionSubpanel from './SessionSubpanel'; +import { formatDistanceToNowStrictShort } from './utils'; + +import 'react-modern-drawer/dist/index.css'; +import { ZIndexContext } from './zIndex'; + +export default function SessionSidePanel({ + sessionId, + dateRange, + onClose, + onPropertyAddClick, + generateSearchUrl, + generateChartUrl, + zIndex = 100, +}: { + sessionId: string; + dateRange: [Date, Date]; + onClose: () => void; + onPropertyAddClick?: (name: string, value: string) => void; + generateSearchUrl: (query?: string, timeRange?: [Date, Date]) => string; + generateChartUrl: (config: { + aggFn: string; + field: string; + groupBy: string[]; + }) => string; + zIndex?: number; +}) { + useHotkeys(['esc'], () => { + onClose(); + }); + + // TODO: DRY with sessions page? + const { data: tableData } = api.useSessions({ + startDate: dateRange[0], + endDate: dateRange[1], + q: `rum_session_id: "${sessionId}"`, + }); + + const session = tableData?.data[0]; + + // Keep track of sub-drawers so we can disable closing this root drawer + const [subDrawerOpen, setSubDrawerOpen] = useState(false); + + useHotkeys( + ['esc'], + () => { + onClose(); + }, + { + enabled: subDrawerOpen === false, + }, + ); + + const maxTime = + session != null ? new Date(session?.maxTimestamp) : new Date(); + const timeAgo = formatDistanceToNowStrictShort(maxTime); + + return ( + { + if (!subDrawerOpen) { + onClose(); + } + }} + direction="right" + size={'85vw'} + style={{ background: '#0F1216' }} + className="border-start border-dark" + zIndex={zIndex} + > + +
+
+
+ {session?.userEmail || `Anonymous Session ${sessionId}`} +
+ Last active {timeAgo} ago + · + {Number.parseInt(session?.errorCount ?? '0') > 0 ? ( + <> + + {session?.errorCount} Errors + + · + + ) : null} + {session?.sessionCount} Events +
+
+
+ { + toast.success('Copied link to clipboard'); + }} + > + + +
+
+
+
+ {sessionId != null ? ( +
+ +
+ ) : null} +
+
+
+ ); +} diff --git a/packages/app/src/SessionSubpanel.tsx b/packages/app/src/SessionSubpanel.tsx new file mode 100644 index 00000000..b69d6975 --- /dev/null +++ b/packages/app/src/SessionSubpanel.tsx @@ -0,0 +1,564 @@ +import ReactDOM from 'react-dom'; +import { format } from 'date-fns'; +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useQueryParam } from 'use-query-params'; +import { throttle } from 'lodash'; +import { NumberParam, StringParam, withDefault } from 'serialize-query-params'; +import { useVirtualizer } from '@tanstack/react-virtual'; + +import DOMPlayer from './DOMPlayer'; +import LogSidePanel from './LogSidePanel'; +import Playbar from './Playbar'; +import SearchInput from './SearchInput'; +import TabBar from './TabBar'; +import { getShortUrl, usePrevious } from './utils'; +import { useSessionEvents } from './sessionUtils'; +import { ZIndexContext } from './zIndex'; + +function SessionEventList({ + config: { where, dateRange }, + onClick, + onTimeClick, + focus, +}: { + config: { + where: string; + dateRange: [Date, Date]; + }; + // highlightedResultId: string | undefined; + focus: { ts: number; setBy: string } | undefined; + onClick: (logId: string, sortKey: string) => void; + onTimeClick: (ts: number) => void; +}) { + const { events, isFetching: isSessionEventsFetching } = useSessionEvents({ + config: { where, dateRange }, + }); + + const rows = useMemo(() => { + return ( + events?.map((event, i) => { + const { startOffset, endOffset } = event; + const tookMs = endOffset - startOffset; + + const isHighlighted = false; + + const url = event['http.url']; + const statusCode = event['http.status_code']; + const method = event['http.method']; + const shortUrl = getShortUrl(url); + + const isNetworkRequest = + method != '' && method != null && url != null && url != ''; + + const errorMessage = event['error.message']; + + const body = event['body']; + const component = event['component']; + const spanName = event['span_name']; + const locationHref = event['location.href']; + const shortLocationHref = getShortUrl(locationHref); + + const isNavigation = + spanName === 'routeChange' || spanName === 'documentLoad'; + + const isError = event.severity_text === 'error' || statusCode > 499; + + const isSuccess = !isError && statusCode < 400 && statusCode > 99; + + return { + id: event.id, + sortKey: event.sort_key, + isError, + isSuccess, + eventSource: isNavigation + ? 'navigation' + : isNetworkRequest + ? 'network' + : spanName === 'intercom.onShow' + ? 'chat' + : 'log', + title: isNavigation + ? `Navigated to ${shortLocationHref}` + : url.length > 0 + ? `${statusCode} ${method}` + : errorMessage != null && errorMessage.length > 0 + ? 'console.error' + : spanName === 'intercom.onShow' + ? 'Intercom Chat Opened' + : component === 'console' + ? spanName + : 'console.error', + description: isNavigation + ? '' + : url.length > 0 + ? shortUrl + : errorMessage != null && errorMessage.length > 0 + ? errorMessage + : component === 'console' + ? body + : '', + timestamp: startOffset, + took: endOffset - startOffset, + }; + }) ?? [] + ); + }, [events]); + + const parentRef = useRef(null); + + // The virtualizer + const rowVirtualizer = useVirtualizer({ + count: rows.length, + getScrollElement: () => parentRef.current, + estimateSize: () => 36, + }); + + if (isSessionEventsFetching) { + return ( +
+ Loading Session Events... +
+ ); + } + + return ( +
+ {/* The large inner element to hold all of the items */} +
+ {/* Only the visible items in the virtualizer, manually positioned to be in view */} + {rowVirtualizer.getVirtualItems().map(virtualItem => { + const row = rows[virtualItem.index]; + const showCompactDescription = + row.description.length < 100 && + row.description.indexOf('\n') === -1; + + return ( +
+
+
onClick(row.id, row.sortKey)} + > +
+ +
+
+ {' '} + {row.title} +
+ {showCompactDescription && ( +
+ {row.description} +
+ )} + {row.took > 0 && ( +
· {row.took}ms
+ )} +
+
onTimeClick(row.timestamp)} + > + + {format(new Date(row.timestamp), 'hh:mm:ss a')} +
+
+ + {!showCompactDescription && ( +
{row.description}
+ )} +
+ ); + })} +
+
+ ); +} +const MemoSessionEventList = memo(SessionEventList); + +const MemoPlaybar = memo(Playbar); + +export default function SessionSubpanel({ + onPropertyAddClick, + generateChartUrl, + generateSearchUrl, + setDrawerOpen, + rumSessionId, + start, + end, + initialTs, +}: { + generateSearchUrl: (query?: string, timeRange?: [Date, Date]) => string; + generateChartUrl: (config: { + aggFn: string; + field: string; + groupBy: string[]; + }) => string; + + onPropertyAddClick?: (name: string, value: string) => void; + setDrawerOpen: (open: boolean) => void; + rumSessionId: string; + start: Date; + end: Date; + initialTs?: number; +}) { + const [selectedLog, setSelectedLog] = useState< + | { + id: string; + sortKey: string; + } + | undefined + >(undefined); + + // Without portaling the nested drawer close overlay will not render properly + const containerRef = useRef(null); + useEffect(() => { + containerRef.current = document.createElement('div'); + + if (containerRef.current) { + document.body.appendChild(containerRef.current); + } + + return () => { + if (containerRef.current) { + document.body.removeChild(containerRef.current); + } + }; + }, []); + const portaledPanel = + containerRef.current != null + ? ReactDOM.createPortal( + { + setDrawerOpen(false); + setSelectedLog(undefined); + }} + onPropertyAddClick={onPropertyAddClick} + generateSearchUrl={generateSearchUrl} + generateChartUrl={generateChartUrl} + isNestedPanel + />, + containerRef.current, + ) + : null; + + const [tsQuery, setTsQuery] = useQueryParam( + 'ts', + withDefault(NumberParam, undefined), + { + updateType: 'pushIn', + // Workaround for qparams not being set properly: https://github.com/pbeshai/use-query-params/issues/233 + enableBatching: true, + }, + ); + const prevTsQuery = usePrevious(tsQuery); + useEffect(() => { + if (prevTsQuery == null && tsQuery != null) { + _setFocus({ ts: tsQuery, setBy: 'url' }); + } + }, [prevTsQuery, tsQuery]); + const debouncedSetTsQuery = useRef( + throttle(async (ts: number) => { + setTsQuery(ts, 'replaceIn'); + }, 1000), + ).current; + useEffect(() => { + return () => { + setTsQuery(undefined, 'replaceIn'); + }; + }, [setTsQuery]); + + const [focus, _setFocus] = useState< + { ts: number; setBy: string } | undefined + >( + initialTs != null + ? { + ts: initialTs, + setBy: 'parent', + } + : undefined, + ); + const setFocus = useCallback( + (focus: { ts: number; setBy: string }) => { + if (focus.setBy === 'player') { + debouncedSetTsQuery(focus.ts); + } else { + setTsQuery(focus.ts, 'pushIn'); + } + _setFocus(focus); + }, + [_setFocus, setTsQuery, debouncedSetTsQuery], + ); + const [playerState, setPlayerState] = useState<'paused' | 'playing'>( + 'paused', + ); + + // Event Filter Input ========================= + const inputRef = useRef(null); + const [_inputQuery, setInputQuery] = useState(undefined); + const inputQuery = _inputQuery ?? ''; + const [_searchedQuery, setSearchedQuery] = useQueryParam( + 'session_q', + withDefault(StringParam, undefined), + { + updateType: 'pushIn', + // Workaround for qparams not being set properly: https://github.com/pbeshai/use-query-params/issues/233 + enableBatching: true, + }, + ); + // Hacky way to set the input query when we search + useEffect(() => { + if (_searchedQuery != null && _inputQuery == null) { + setInputQuery(_searchedQuery); + } + }, [_searchedQuery, _inputQuery]); + // Allows us to determine if the user has changed the search query + const searchedQuery = _searchedQuery ?? ''; + // Clear search query when we close the panel + useEffect(() => { + return () => { + setSearchedQuery(undefined, 'replaceIn'); + }; + }, [setSearchedQuery]); + + // Focused Tab =============================== + const [tab, setTab] = useState<'events' | 'highlighted' | undefined>( + undefined, + ); + const displayedTab = tab ?? 'highlighted'; + + // Playbar ==================================== + const [playerSpeed, setPlayerSpeed] = useState(1); + const [skipInactive, setSkipInactive] = useState(true); + + // XXX: This is a hack for the hack, we offset start/end by 4 hours + // to ensure we capture all rrweb events on query. However, we + // need to un-offset the time for the playback slider to show sane values. + // these values get updated by the DOM player when events are loaded + const [playerStartTs, setPlayerStartTs] = useState( + start.getTime() + 4 * 60 * 60 * 1000, + ); + const [playerEndTs, setPlayerEndTs] = useState( + end.getTime() - 4 * 60 * 60 * 1000, + ); + const playbackRange = useMemo(() => { + return [new Date(playerStartTs), new Date(playerEndTs)] as [Date, Date]; + }, [playerStartTs, playerEndTs]); + + const playBarEventsConfig = useMemo( + () => ({ + where: `rum_session_id:"${rumSessionId}" (http.status_code:>299 OR component:"error" OR span_name:"routeChange" OR span_name:"documentLoad" OR span_name:"intercom.onShow") ${searchedQuery}`, + dateRange: [start, end] as [Date, Date], + }), + [rumSessionId, start, end, searchedQuery], + ); + const [playerFullWidth, setPlayerFullWidth] = useState(false); + + const sessionEventListConfig = useMemo( + () => ({ + where: `rum_session_id:"${rumSessionId}" (http.status_code:>${ + displayedTab === 'events' ? '0' : '299' + } OR component:"error" ${ + displayedTab === 'events' ? 'OR component:"console"' : '' + } OR span_name:"routeChange" OR span_name:"documentLoad" OR span_name:"intercom.onShow") ${searchedQuery}`, + dateRange: [start, end] as [Date, Date], + }), + [rumSessionId, start, end, displayedTab, searchedQuery], + ); + return ( +
+ {selectedLog != null && portaledPanel} +
+ setTab(v)} + /> +
{ + e.preventDefault(); + setSearchedQuery(inputQuery); + }} + > + setInputQuery(value)} + onSearch={() => {}} + placeholder="Filter events by page, endpoint..." + /> +
+
+
Session Player
+
+
+ +
+ { + if (focus?.setBy !== 'player' || focus?.ts !== ts) { + setFocus({ ts, setBy: 'player' }); + } + }, + [focus, setFocus], + )} + config={{ + sessionId: rumSessionId, + dateRange: [start, end], + }} + playerSpeed={playerSpeed} + skipInactive={skipInactive} + setPlayerStartTimestamp={setPlayerStartTs} + setPlayerEndTimestamp={setPlayerEndTs} + resizeKey={`${playerFullWidth}`} + /> +
+
+
+ ); +} diff --git a/packages/app/src/SessionsPage.tsx b/packages/app/src/SessionsPage.tsx new file mode 100644 index 00000000..bc3af74f --- /dev/null +++ b/packages/app/src/SessionsPage.tsx @@ -0,0 +1,422 @@ +import Head from 'next/head'; +import { Button } from 'react-bootstrap'; +import { + useQueryParam, + StringParam, + withDefault, + useQueryParams, +} from 'use-query-params'; +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { NumberParam } from 'serialize-query-params'; + +import api from './api'; +import SearchTimeRangePicker from './SearchTimeRangePicker'; +import AppNav from './AppNav'; +import { + formatDistanceToNowStrictShort, + formatHumanReadableDate, +} from './utils'; +import { parseTimeQuery, useTimeQuery } from './timeQuery'; +import SearchInput from './SearchInput'; +import SessionSidePanel from './SessionSidePanel'; +import { sub } from 'date-fns'; +import { useVirtualizer } from '@tanstack/react-virtual'; + +function SessionCard({ + email, + maxTime, + minTime, + numErrors, + numEvents, + onClick, + sessionId, + teamId, + teamName, + userName, +}: { + email: string; + maxTime: Date; + minTime: Date; + numErrors: number; + numEvents: number; + onClick: () => void; + sessionId: string; + teamId: string; + teamName: string; + userName: string; +}) { + const timeAgo = formatDistanceToNowStrictShort(maxTime); + const durationStr = new Date(maxTime.getTime() - minTime.getTime()) + .toISOString() + .slice(11, 19); + + return ( +
+
+ {email || `Anonymous Session ${sessionId}`} +
+
+
{numEvents} Events
+ {numErrors > 0 && ( +
{numErrors} Errors
+ )} +
Duration {durationStr}
+
+
+
Last active {timeAgo} ago
+
+ Started on {formatHumanReadableDate(minTime)} +
+
+
+ ); +} + +function SessionCardList({ + config: { where, dateRange }, + onClick, +}: { + config: { + where: string; + dateRange: [Date, Date]; + }; + onClick: (sessionId: string, dateRange: [Date, Date]) => void; +}) { + const { data: tableData, isLoading: isTableDataLoading } = api.useSessions({ + startDate: dateRange[0], + endDate: dateRange[1], + q: where, + }); + + const sessions = tableData?.data ?? []; + + const parentRef = useRef(null); + + // The virtualizer + const rowVirtualizer = useVirtualizer({ + count: sessions.length, + getScrollElement: () => parentRef.current, + estimateSize: () => 86, + paddingEnd: 16, + }); + + return ( + <> + {isTableDataLoading === true && ( +
+
+ Searching sessions... +
+ )} + {!isTableDataLoading && sessions.length === 0 && ( +
+ No results found. +
+ Try checking the query explainer in the search bar if there are any + search syntax issues. +
+
+ Add new data sources by setting up a HyperDX integration. +
+ +
+ )} +
+ {/* The large inner element to hold all of the items */} +
+ {/* Only the visible items in the virtualizer, manually positioned to be in view */} + {rowVirtualizer.getVirtualItems().map(virtualItem => { + const row = sessions[virtualItem.index]; + + const { + errorCount, + maxTimestamp, + minTimestamp, + sessionCount, + sessionId, + teamId, + teamName, + userEmail, + userName, + } = row; + return ( +
+
+ { + onClick(sessionId, [ + sub(new Date(minTimestamp), { hours: 4 }), + sub(new Date(maxTimestamp), { hours: -4 }), + ]); + }} + /> +
+
+ ); + })} +
+
+ + ); +} + +// TODO: This is a hack to set the default time range +const defaultTimeRange = parseTimeQuery('Past 1h', false); +export default function SessionsPage() { + const inputRef = useRef(null); + const [inputQuery, setInputQuery] = useState(''); + + const [_searchedQuery, setSearchedQuery] = useQueryParam( + 'q', + withDefault(StringParam, undefined), + { + updateType: 'pushIn', + // Workaround for qparams not being set properly: https://github.com/pbeshai/use-query-params/issues/233 + enableBatching: true, + }, + ); + // Allows us to determine if the user has changed the search query + const searchedQuery = _searchedQuery ?? ''; + + // TODO: Set displayed query to qparam... in a less bad way? + useEffect(() => { + setInputQuery(searchedQuery); + }, [searchedQuery]); + + const { + searchedTimeRange, + displayedTimeInputValue, + setDisplayedTimeInputValue, + onSearch, + } = useTimeQuery({ + isUTC: false, + defaultValue: 'Past 1h', + defaultTimeRange: [ + defaultTimeRange?.[0]?.getTime() ?? -1, + defaultTimeRange?.[1]?.getTime() ?? -1, + ], + }); + + const [startDate, endDate] = searchedTimeRange; + + const [selectedSessionQuery, setSelectedSessionQuery] = useQueryParams( + { + sid: withDefault(StringParam, undefined), + sfrom: withDefault(NumberParam, undefined), + sto: withDefault(NumberParam, undefined), + }, + { + updateType: 'pushIn', + enableBatching: true, + }, + ); + + const selectedSession = useMemo(() => { + if (selectedSessionQuery.sid == null) { + return undefined; + } + return { + id: selectedSessionQuery.sid, + dateRange: [ + new Date(selectedSessionQuery.sfrom ?? 0), + new Date(selectedSessionQuery.sto ?? 0), + ] as [Date, Date], + }; + }, [selectedSessionQuery]); + const setSelectedSession = useCallback( + ( + session: + | { + id: string; + dateRange: [Date, Date]; + } + | undefined, + ) => { + if (session == null) { + setSelectedSessionQuery({ + sid: undefined, + sfrom: undefined, + sto: undefined, + }); + } else { + setSelectedSessionQuery({ + sid: session.id, + sfrom: session.dateRange[0].getTime(), + sto: session.dateRange[1].getTime(), + }); + } + }, + [setSelectedSessionQuery], + ); + + const generateSearchUrl = useCallback( + (newQuery?: string, newTimeRange?: [Date, Date]) => { + const qparams = new URLSearchParams({ + q: newQuery ?? searchedQuery, + from: newTimeRange + ? newTimeRange[0].getTime().toString() + : startDate.getTime().toString(), + to: newTimeRange + ? newTimeRange[1].getTime().toString() + : endDate.getTime().toString(), + }); + return `/search?${qparams.toString()}`; + }, + [], + ); + + const generateChartUrl = useCallback(({ aggFn, field, where, groupBy }) => { + return `/chart?series=${encodeURIComponent( + JSON.stringify({ + type: 'time', + aggFn, + field, + where, + groupBy, + }), + )}`; + }, []); + + return ( +
+ + Client Sessions - HyperDX + + + {selectedSession != null && ( + { + setSelectedSession(undefined); + }} + generateSearchUrl={generateSearchUrl} + generateChartUrl={({ aggFn, field, groupBy }) => + generateChartUrl({ + aggFn, + field, + groupBy, + where: `rum_session_id:"${selectedSession.id}"`, + }) + } + /> + )} +
+
+
Client Sessions
+
+
{ + e.preventDefault(); + onSearch(displayedTimeInputValue); + }} + > + { + onSearch(range); + }} + /> + + +
+
+
{ + e.preventDefault(); + setSearchedQuery(inputQuery); + }} + > + setInputQuery(value)} + onSearch={() => {}} + placeholder="Search for a session by email, id..." + /> +
+
+ ); +} diff --git a/packages/app/src/TabBar.tsx b/packages/app/src/TabBar.tsx new file mode 100644 index 00000000..c75b311b --- /dev/null +++ b/packages/app/src/TabBar.tsx @@ -0,0 +1,33 @@ +import cx from 'classnames'; + +import TabItem from './TabItem'; + +export default function TabBar({ + items, + activeItem, + className, + onClick, +}: { + items: Array<{ value: T; text: React.ReactNode }>; + activeItem: T; + className?: string | undefined; + onClick?: (item: T) => any; +}) { + return ( +
+ {items.map(item => { + return ( + onClick?.(item.value)} + > + {item.text} + + ); + })} + {/* Fill the rest of the space */} +   +
+ ); +} diff --git a/packages/app/src/TabBarWithContent.tsx b/packages/app/src/TabBarWithContent.tsx new file mode 100644 index 00000000..c0302774 --- /dev/null +++ b/packages/app/src/TabBarWithContent.tsx @@ -0,0 +1,38 @@ +import { useState } from 'react'; + +import TabBar from './TabBar'; + +export default function TabBarWithContent({ + items, +}: { + items: { + value: string; + text: React.ReactNode; + children: React.ReactNode; + }[]; +}) { + const [activeItem, setActiveItem] = useState( + items[0].value, + ); + return ( +
+ setActiveItem(value)} + /> + {items.map(item => { + return ( +
+ {item.children} +
+ ); + })} +
+ ); +} diff --git a/packages/app/src/TabItem.tsx b/packages/app/src/TabItem.tsx new file mode 100644 index 00000000..4101b295 --- /dev/null +++ b/packages/app/src/TabItem.tsx @@ -0,0 +1,34 @@ +import cx from 'classnames'; + +export default function TabItem({ + children, + onClick, + active, + className, + style, +}: any) { + return ( +
+ {children} +
+
+
+
+ ); +} diff --git a/packages/app/src/TeamPage.tsx b/packages/app/src/TeamPage.tsx new file mode 100644 index 00000000..4ade0c6f --- /dev/null +++ b/packages/app/src/TeamPage.tsx @@ -0,0 +1,430 @@ +import Head from 'next/head'; +import Link from 'next/link'; +import { + Badge, + Button, + Container, + Form, + Modal, + Row, + Spinner, +} from 'react-bootstrap'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import { toast } from 'react-toastify'; +import { useState } from 'react'; + +import AppNav from './AppNav'; +import api from './api'; +import { isValidUrl } from './utils'; + +export default function TeamPage() { + const [ + rotateApiKeyConfirmationModalShow, + setRotateApiKeyConfirmationModalShow, + ] = useState(false); + const [teamInviteModalShow, setTeamInviteModalShow] = useState(false); + const [teamInviteUrl, setTeamInviteUrl] = useState(''); + const [addSlackWebhookModalShow, setAddSlackWebhookModalShow] = + useState(false); + const { data: me, isLoading: isLoadingMe } = api.useMe(); + const { data: team, isLoading, refetch: refetchTeam } = api.useTeam(); + const { data: slackWebhooks, refetch: refetchSlackWebhooks } = + api.useWebhooks('slack'); + const sendTeamInvite = api.useSendTeamInvite(); + const rotateTeamApiKey = api.useRotateTeamApiKey(); + const saveWebhook = api.useSaveWebhook(); + const deleteWebhook = api.useDeleteWebhook(); + + const hasAllowedAuthMethods = + team?.allowedAuthMethods != null && team?.allowedAuthMethods.length > 0; + + const rotateTeamApiKeyAction = () => { + rotateTeamApiKey.mutate(undefined, { + onSuccess: resp => { + toast.success('Revoked old API key and generated new key.'); + refetchTeam(); + }, + onError: e => { + e.response + .json() + .then(res => { + toast.error(res.message, { + autoClose: 5000, + }); + }) + .catch(() => { + toast.error('Something went wrong. Please contact HyperDX team.', { + autoClose: 5000, + }); + }); + }, + }); + }; + + const onConfirmUpdateTeamApiKey = () => { + rotateTeamApiKeyAction(); + setRotateApiKeyConfirmationModalShow(false); + }; + + const sendTeamInviteAction = (email: string) => { + if (email) { + sendTeamInvite.mutate( + { email }, + { + onSuccess: resp => { + toast.success( + 'Click "Copy URL" and share the URL with your team member', + ); + refetchTeam(); + }, + onError: e => { + e.response + .json() + .then(res => { + toast.error(res.message, { + autoClose: 5000, + }); + }) + .catch(() => { + toast.error( + 'Something went wrong. Please contact HyperDX team.', + { + autoClose: 5000, + }, + ); + }); + }, + }, + ); + } + }; + + const onSubmitTeamInviteForm = (e: any) => { + e.preventDefault(); + const email = e.target[0].value; + sendTeamInviteAction(email); + setTeamInviteModalShow(false); + }; + + const onSubmitAddSlackWebhookForm = (e: any) => { + e.preventDefault(); + const name = e.target[0].value; + const url = e.target[1].value; + if (!name) { + toast.error('Please enter a name for the Slack webhook'); + return; + } + if (!url || !isValidUrl(url) || !url.includes('hooks.slack.com')) { + toast.error('Please enter a valid Slack webhook URL'); + return; + } + saveWebhook.mutate( + { name, service: 'slack', url }, + { + onSuccess: () => { + toast.success('Saved Slack webhook'); + refetchSlackWebhooks(); + }, + onError: e => { + e.response + .json() + .then(res => { + toast.error(res.message, { + autoClose: 5000, + }); + }) + .catch(() => { + toast.error( + 'Something went wrong. Please contact HyperDX team.', + { + autoClose: 5000, + }, + ); + }); + }, + }, + ); + setAddSlackWebhookModalShow(false); + }; + + const onConfirmDeleteSlackWebhook = (webhookId: string) => { + deleteWebhook.mutate( + { + id: webhookId, + }, + { + onSuccess: () => { + toast.success('Deleted Slack webhook'); + refetchSlackWebhooks(); + }, + onError: e => { + e.response + .json() + .then(res => { + toast.error(res.message, { + autoClose: 5000, + }); + }) + .catch(() => { + toast.error( + 'Something went wrong. Please contact HyperDX team.', + { + autoClose: 5000, + }, + ); + }); + }, + }, + ); + }; + + return ( +
+ + My Team - HyperDX + +
+ + + +
+ {team != null &&

{team.name}

} + {team == null &&

My Team

} +
+
+ {isLoading && ( + + Loading... + + )} + {!isLoading && team != null && ( + <> +
+
Ingestion API Key:
+ + {team.apiKey} + + + + +
+ + setRotateApiKeyConfirmationModalShow(false)} + show={rotateApiKeyConfirmationModalShow} + size="lg" + > + +

Rotate API Key

+
+ Rotating the API key will invalidate your existing API + key and generate a new one for you. This action is not + reversible. +
+ + +
+
+
+
+
+

Slack Webhooks

+
+ Lean how to set up a Slack webhook{' '} + + here. + +
+ {Array.isArray(slackWebhooks?.data) && + slackWebhooks.data.length > 0 && + slackWebhooks.data.map((webhook: any) => ( +
+
+
{webhook.name}
+
|
+
{webhook.url}
+ +
+
+ ))} + + setAddSlackWebhookModalShow(false)} + show={addSlackWebhookModalShow} + size="lg" + > + +
Add Slack Incoming Webhook
+
+ + Webhook Name + + + + Webhook URL + + + + +
+
+
+ {hasAllowedAuthMethods && ( + <> +

Security Policies

+ {team.allowedAuthMethods != null && + team.allowedAuthMethods.length > 0 && ( +
+ Team members can only authenticate via:{' '} + + {team.allowedAuthMethods.join(', ')} + +
+ )} + + )} +

Team Members

+ {team.users.map((user: any) => ( +
+ {user.isCurrentUser && ( + (You) + )} + {user.name} - {user.email} - + {user.hasPasswordAuth && ' Password Auth'} +
+ ))} + {team.teamInvites.map((teamInvite: any) => ( +
+ {teamInvite.email} - Pending Invite - + + + +
+ ))} +
+ + setTeamInviteModalShow(false)} + show={teamInviteModalShow} + size="lg" + > + +
Invite Team Member
+
+ + Email Address + + + + +
+
+
+ + )} +
+
+
+ ); +} diff --git a/packages/app/src/TimelineChart.tsx b/packages/app/src/TimelineChart.tsx new file mode 100644 index 00000000..c57dbc7a --- /dev/null +++ b/packages/app/src/TimelineChart.tsx @@ -0,0 +1,569 @@ +import cx from 'classnames'; +import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; +import Tooltip from 'react-bootstrap/Tooltip'; +import { useEffect, useRef, useState, memo, RefObject } from 'react'; +import { useVirtualizer } from '@tanstack/react-virtual'; + +import { useDrag, usePrevious } from './utils'; + +type TimelineEventT = { + id: string; + start: number; + end: number; + tooltip: string; + color: string; + body: React.ReactNode; + minWidthPerc?: number; +}; + +const NewTimelineRow = memo( + function NewTimelineRow({ + events, + maxVal, + height, + eventStyles, + onEventHover, + onEventClick, + scale, + offset, + }: { + events: TimelineEventT[] | undefined; + maxVal: number; + height: number; + scale: number; + offset: number; + eventStyles?: any; + onEventHover?: Function; + onEventClick?: (event: any) => any; + }) { + const onHover = onEventHover ?? (() => {}); + const onClick = onEventClick ?? (() => {}); + return ( +
+
+ {(events ?? []).map((e: TimelineEventT, i, arr) => { + const minWidth = (e.minWidthPerc ?? 0) / 100; + const lastEvent = arr[i - 1]; + const lastEventMinEnd = + lastEvent?.start != null ? lastEvent?.start + maxVal * minWidth : 0; + const lastEventEnd = Math.max(lastEvent?.end ?? 0, lastEventMinEnd); + + const percWidth = + scale * Math.max((e.end - e.start) / maxVal, minWidth) * 100; + const percMarginLeft = + scale * (((e.start - lastEventEnd) / maxVal) * 100); + + return ( + {e.tooltip} + } + > +
onHover(e.id)} + onClick={() => onClick(e)} + className="d-flex align-items-center h-100 cursor-pointer text-truncate" + style={{ + userSelect: 'none', + backgroundColor: e.color, + minWidth: `${percWidth.toFixed(6)}%`, + width: `${percWidth.toFixed(6)}%`, + marginLeft: `${percMarginLeft.toFixed(6)}%`, + ...eventStyles, + }} + > +
+ {e.body} +
+
+
+ ); + })} +
+ ); + }, + // TODO: Revisit this? + // (prev, next) => { + // // TODO: This is a hack for cheap comparisons + // return ( + // prev.maxVal === next.maxVal && + // prev.events?.length === next.events?.length && + // prev.scale === next.scale && + // prev.offset === next.offset + // ); + // }, +); + +function renderMs(ms: number) { + return ms < 1000 + ? `${Math.round(ms)}ms` + : ms % 1000 === 0 + ? `${Math.floor(ms / 1000)}s` + : `${(ms / 1000).toFixed(3)}s`; +} + +function TimelineXAxis({ + maxVal, + labelWidth, + height, + scale, + offset, +}: { + maxVal: number; + labelWidth: number; + height: number; + scale: number; + offset: number; +}) { + const scaledMaxVal = maxVal / scale; + // TODO: Turn this into a function + const interval = + scaledMaxVal < 10 + ? 1 + : scaledMaxVal < 100 + ? 10 + : scaledMaxVal < 300 + ? 20 + : scaledMaxVal < 1000 + ? 100 + : scaledMaxVal < 3000 + ? 200 + : scaledMaxVal < 10000 + ? 1000 + : scaledMaxVal < 30000 + ? 2000 + : scaledMaxVal < 100000 + ? 10000 + : scaledMaxVal < 300000 + ? 20000 + : scaledMaxVal < 10 * 60 * 1000 + ? 1 * 60 * 1000 + : scaledMaxVal < 30 * 60 * 1000 + ? 3 * 60 * 1000 + : scaledMaxVal < 60 * 60 * 1000 + ? 6 * 60 * 1000 + : 20 * 60 * 1000; + + const numTicks = Math.floor(maxVal / interval); + const percSpacing = (interval / maxVal) * 100 * scale; + + const ticks = []; + for (let i = 0; i < numTicks; i++) { + ticks.push( +
+
{renderMs(i * interval)}
+
, + ); + } + + return ( +
+
+
+
+
+ {ticks} +
+
+
+ ); +} + +function TimelineCursor({ + xPerc, + overlay, + labelWidth, + color, + height, +}: { + xPerc: number; + overlay?: React.ReactNode; + labelWidth: number; + color: string; + height: number; +}) { + // Bound [-1,100] to 6 digits as a percent, -1 so it can slide off the right side of the screen + const cursorMarginLeft = `${Math.min(Math.max(xPerc * 100, -1), 100).toFixed( + 6, + )}%`; + + return ( +
+
+
+
+
+ {overlay != null && ( +
+
+ + {overlay} + +
+
+ )} +
+
+
+
+
+ ); +} + +function TimelineMouseCursor({ + containerRef, + maxVal, + labelWidth, + height, + scale, + offset, + xPerc, + setXPerc, +}: { + containerRef: RefObject; + maxVal: number; + labelWidth: number; + height: number; + scale: number; + offset: number; + xPerc: number; + setXPerc: (p: number) => any; +}) { + const [showCursor, setShowCursor] = useState(false); + useEffect(() => { + const onMouseMove = (e: MouseEvent) => { + if (containerRef.current != null) { + const timelineContainer = containerRef.current; + const rect = timelineContainer.getBoundingClientRect(); + + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + + // Remove label width from calculations + // Use clientWidth as that removes scroll bars + const xPerc = + (x - labelWidth) / (timelineContainer.clientWidth - labelWidth); + if (onMouseMove != null) { + setXPerc(xPerc); + } + } + }; + const onMouseEnter = () => setShowCursor(true); + const onMouseLeave = () => setShowCursor(false); + + const element = containerRef.current; + element?.addEventListener('mousemove', onMouseMove); + element?.addEventListener('mouseleave', onMouseLeave); + element?.addEventListener('mouseenter', onMouseEnter); + + return () => { + element?.removeEventListener('mousemove', onMouseMove); + element?.removeEventListener('mouseleave', onMouseLeave); + element?.removeEventListener('mouseenter', onMouseEnter); + }; + }, [containerRef, labelWidth, setXPerc]); + + const cursorTime = (offset / 100 + Math.max(xPerc, 0) / scale) * maxVal; + + return showCursor ? ( + + ) : null; +} + +type Row = { + id: string; + label: React.ReactNode; + events: TimelineEventT[]; + style?: any; + className?: string; +}; + +export default function TimelineChart({ + rows, + cursors, + rowHeight, + maxVal, + onMouseMove, + onEventClick, + labelWidth, + className, + style, + onClick, + scale = 1, + setScale = () => {}, + initialScrollRowIndex, + scaleWithScroll: scaleWithScroll = false, +}: { + rows: Row[] | undefined; + cursors?: { + id: string; + start: number; + color: string; + }[]; + scale?: number; + rowHeight: number; + maxVal: number; + onMouseMove?: (ts: number) => any; + onClick?: (ts: number) => any; + onEventClick?: (e: any) => any; + labelWidth: number; + className?: string; + style?: any; + setScale?: (cb: (scale: number) => number) => any; + scaleWithScroll?: boolean; + initialScrollRowIndex?: number; +}) { + const [offset, setOffset] = useState(0); + const prevScale = usePrevious(scale); + + const timelineRef = useRef(null); + const onMouseEvent = ( + e: { clientX: number; clientY: number }, + cb: Function | undefined, + ) => { + if (timelineRef.current != null && cb != null) { + const timelineContainer = timelineRef.current; + const rect = timelineContainer.getBoundingClientRect(); + + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + + // Remove label width from calculations + // Use clientWidth as that removes scroll bars + const xPerc = + (x - labelWidth) / (timelineContainer.clientWidth - labelWidth); + cb(Math.max((offset / 100 + xPerc / scale) * maxVal)); + } + }; + + useDrag(timelineRef, [], { + onDrag: e => { + setOffset(v => + Math.min( + Math.max(v - e.movementX * (0.125 / scale), 0), + 100 - 100 / scale, + ), + ); + }, + }); + + const [cursorXPerc, setCursorXPerc] = useState(0); + + const onWheel = (e: WheelEvent) => { + if (scaleWithScroll) { + e.preventDefault(); + setScale(v => Math.max(v - e.deltaY * 0.001, 1)); + } + }; + + useEffect(() => { + if (prevScale != null && prevScale != scale) { + setOffset(offset => { + const newScale = scale; + + // we try to calculate the new offset we need to keep the cursor's + // abs % the same between current scale and new scale + // cursor abs % = cursorTime/maxVal = offset / 100 + xPerc / scale + const boundedCursorXPerc = Math.max(Math.min(cursorXPerc, 1), 0); + const newOffset = + offset + + (100 * boundedCursorXPerc) / prevScale - + (100 * boundedCursorXPerc) / newScale; + + return Math.min(Math.max(newOffset, 0), 100 - 100 / scale); + }); + } + }, [scale, prevScale, cursorXPerc]); + + useEffect(() => { + const element = timelineRef.current; + if (element != null) { + element.addEventListener('wheel', onWheel, { + passive: false, + }); + + return () => { + element.removeEventListener('wheel', onWheel); + }; + } + }); + + const rowVirtualizer = useVirtualizer({ + count: rows?.length ?? 0, + getScrollElement: () => timelineRef.current, + estimateSize: () => rowHeight, + overscan: 5, + }); + const items = rowVirtualizer.getVirtualItems(); + + const [initialScrolled, setInitialScrolled] = useState(false); + useEffect(() => { + if ( + initialScrollRowIndex != null && + !initialScrolled && + initialScrollRowIndex >= 0 + ) { + setInitialScrolled(true); + rowVirtualizer.scrollToIndex(initialScrollRowIndex); + } + }, [initialScrollRowIndex, initialScrolled, rowVirtualizer]); + + return ( +
{ + onMouseEvent(e, onClick); + }} + onMouseMove={e => { + onMouseEvent(e, onMouseMove); + }} + > + {(cursors ?? ([] as const)).map(cursor => { + const xPerc = (cursor.start / maxVal - offset / 100) * scale; + return ( + + ); + })} + + + +
+
+ {rowVirtualizer.getVirtualItems().map(virtualRow => { + const row = rows?.[virtualRow.index] as Row; + return ( +
+
+ {row.label} +
+ +
+ ); + })} +
+
+
+ ); +} diff --git a/packages/app/src/api.ts b/packages/app/src/api.ts new file mode 100644 index 00000000..aa0a6634 --- /dev/null +++ b/packages/app/src/api.ts @@ -0,0 +1,547 @@ +import Router from 'next/router'; +import ky from 'ky-universal'; +import { + useInfiniteQuery, + useMutation, + useQuery, + useQueryClient, +} from 'react-query'; + +import { API_SERVER_URL } from './config'; + +import type { AlertChannel, AlertInterval, LogView, Session } from './types'; +import type { HTTPError } from 'ky'; +import type { UseQueryOptions } from 'react-query'; + +function loginHook(request: Request, options: any, response: Response) { + // marketing pages + const WHITELIST_PATHS = [ + '/', + '/forgot', + '/join-team', + '/login', + '/register', + '/reset-password', + ]; + if (!WHITELIST_PATHS.includes(Router.pathname) && response.status === 401) { + try { + window.sessionStorage.setItem('hdx-login-redirect-url', Router.asPath); + } catch (e: any) { + console.error(e); + } + Router.push('/login'); + } +} + +export const server = ky.create({ + prefixUrl: API_SERVER_URL, + credentials: 'include', + hooks: { + afterResponse: [loginHook], + }, + timeout: false, +}); + +const api = { + usePropertyTypeMappings(options?: UseQueryOptions) { + return useQuery, Error>( + `logs/propertyTypeMappings`, + () => + server(`logs/propertyTypeMappings`, { + method: 'GET', + }) + .json<{ data: any[] }>() + .then(res => new Map(res.data)), + { + staleTime: 1000 * 60 * 5, // Cache every 5 min + ...options, + }, + ); + }, + useMetricsTags() { + return useQuery< + { + data: { + name: string; + tags: Record[]; + }[]; + }, + Error + >({ + refetchOnWindowFocus: false, + queryKey: ['metrics/tags'], + queryFn: () => + server('metrics/tags', { + method: 'GET', + }).json(), + }); + }, + useMetricsChart( + { + aggFn, + endDate, + granularity, + name, + q, + startDate, + groupBy, + }: { + aggFn: string; + endDate: Date; + granularity: string | undefined; + name: string; + q: string; + startDate: Date; + groupBy: string; + }, + options?: UseQueryOptions, + ) { + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); + return useQuery({ + refetchOnWindowFocus: false, + queryKey: [ + 'metrics/chart', + name, + aggFn, + endTime, + granularity, + startTime, + q, + groupBy, + ], + queryFn: () => + server('metrics/chart', { + method: 'POST', + json: { + aggFn, + endTime, + granularity, + name, + q, + startTime, + groupBy, + }, + }).json(), + ...options, + }); + }, + useLogsChart( + { + aggFn, + endDate, + field, + granularity, + groupBy, + q, + startDate, + sortOrder, + }: { + aggFn: string; + endDate: Date; + field: string; + granularity: string | undefined; + groupBy: string; + q: string; + startDate: Date; + sortOrder?: 'asc' | 'desc'; + }, + options?: UseQueryOptions, + ) { + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); + return useQuery({ + refetchOnWindowFocus: false, + queryKey: [ + 'logs/chart', + aggFn, + endTime, + field, + granularity, + groupBy, + q, + startTime, + sortOrder, + ], + queryFn: () => + server('logs/chart', { + method: 'GET', + searchParams: [ + ['aggFn', aggFn], + ['endTime', endTime], + ['field', field ?? ''], + ...(granularity != null ? [['granularity', granularity]] : []), + ['groupBy', groupBy ?? ''], + ['q', q], + ['startTime', startTime], + ...(sortOrder != null ? [['sortOrder', sortOrder]] : []), + ], + }).json(), + retry: 1, + ...options, + }); + }, + useLogsChartHistogram( + { + endDate, + field, + q, + startDate, + }: { + endDate: Date; + field: string; + q: string; + startDate: Date; + }, + options?: UseQueryOptions, + ) { + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); + return useQuery({ + refetchOnWindowFocus: false, + queryKey: ['logs/chart/histogram', endTime, field, q, startTime], + queryFn: () => + server('logs/chart/histogram', { + method: 'GET', + searchParams: [ + ['endTime', endTime], + ['field', field ?? ''], + ['q', q], + ['startTime', startTime], + ], + }).json(), + retry: 1, + ...options, + }); + }, + useLogBatch( + { + q, + startDate, + endDate, + extraFields, + order, + limit = 100, + }: { + q: string; + startDate: Date; + endDate: Date; + extraFields: string[]; + order: 'asc' | 'desc' | null; + limit?: number; + }, + options?: UseQueryOptions, + ) { + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); + return useInfiniteQuery<{ data: any[] }, Error>({ + queryKey: ['logs', q, startTime, endTime, extraFields, order, limit], + queryFn: async ({ pageParam = 0 }) => + server('logs', { + method: 'GET', + searchParams: [ + ['endTime', endTime], + ['offset', pageParam], + ['q', q], + ['startTime', startTime], + ['order', order], + ['limit', limit], + ...extraFields.map(field => ['extraFields[]', field]), + ], + }).json(), + ...options, + }); + }, + useLogPatterns( + { + q, + startDate, + endDate, + sampleRate, + }: { + q: string; + startDate: Date; + endDate: Date; + sampleRate: number; + }, + options?: UseQueryOptions, + ) { + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); + return useQuery<{ data: any[] }, Error>({ + queryKey: ['logs', 'patterns', q, startTime, endTime], + queryFn: async () => + server('logs/patterns', { + method: 'GET', + searchParams: [ + ['endTime', endTime], + ['q', q], + ['startTime', startTime], + ['sampleRate', sampleRate], + ], + }).json(), + ...options, + }); + }, + useSessions({ + endDate, + startDate, + q, + }: { + endDate: Date; + startDate: Date; + q: string; + }) { + const startTime = startDate.getTime(); + const endTime = endDate.getTime(); + return useQuery<{ data: Session[] }, Error>({ + refetchOnWindowFocus: false, + queryKey: [startTime, endTime, q], + queryFn: () => + server('sessions', { + method: 'GET', + searchParams: [ + ['endTime', endTime], + ['q', q], + ['startTime', startTime], + ], + }).json(), + }); + }, + useLogViews() { + return useQuery<{ data: LogView[] }, Error>({ + queryKey: ['log-views'], + queryFn: () => server.get('log-views').json(), + }); + }, + useDeleteLogView() { + return useMutation( + `log-views`, + async (logViewId: string) => + server(`log-views/${logViewId}`, { + method: 'DELETE', + }), + ); + }, + useSaveLogView() { + return useMutation< + any, + Error, + { + name: string; + query: string; + } + >(`log-views`, async ({ name, query }) => + server('log-views', { + method: 'POST', + json: { + query, + name, + }, + }).json(), + ); + }, + useUpdateLogView() { + return useMutation< + any, + Error, + { + id: string; + query: string; + } + >(`log-views`, async ({ id, query }) => + server(`log-views/${id}`, { + method: 'PATCH', + json: { + query, + }, + }).json(), + ); + }, + useSaveAlert() { + return useMutation< + any, + Error, + { + channel: AlertChannel; + groupBy: string | undefined; + interval: AlertInterval; + logViewId: string; + threshold: number; + type: string; + } + >(`alerts`, async alert => + server('alerts', { + method: 'POST', + json: alert, + }).json(), + ); + }, + useUpdateAlert() { + return useMutation< + any, + Error, + { + channel: AlertChannel; + groupBy: string | undefined; + id: string; + interval: AlertInterval; + logViewId: string; + threshold: number; + type: string; + } + >(`alerts`, async alert => + server(`alerts/${alert.id}`, { + method: 'PUT', + json: alert, + }).json(), + ); + }, + useDeleteAlert() { + return useMutation(`alerts`, async (alertId: string) => + server(`alerts/${alertId}`, { + method: 'DELETE', + }), + ); + }, + useLogHistogram( + q: string, + startDate: Date, + endDate: Date, + options?: UseQueryOptions, + ) { + const st = startDate.getTime(); + const et = endDate.getTime(); + return useQuery({ + queryKey: ['logs/histogram', q, st, et], + queryFn: () => + server('logs/histogram', { + method: 'GET', + searchParams: [ + ['q', q], + ['startTime', st], + ['endTime', et], + ], + }).json(), + ...options, + }); + }, + useDashboards(options?: UseQueryOptions) { + return useQuery( + `dashboards`, + () => server.get(`dashboards`).json(), + options, + ); + }, + useCreateDashboard() { + return useMutation< + any, + HTTPError, + { name: string; query: string; charts: any[] } + >(async ({ name, charts, query }) => + server(`dashboards`, { + method: 'POST', + json: { name, charts, query }, + }).json(), + ); + }, + useUpdateDashboard() { + return useMutation< + any, + HTTPError, + { id: string; name: string; query: string; charts: any[] } + >(async ({ id, name, charts, query }) => + server(`dashboards/${id}`, { + method: 'PUT', + json: { name, charts, query }, + }).json(), + ); + }, + useDeleteDashboard() { + return useMutation(async ({ id }) => + server(`dashboards/${id}`, { + method: 'DELETE', + }).json(), + ); + }, + useLogDetails( + logId: string, + sortKey: string, + options?: UseQueryOptions, + ) { + return useQuery( + `logs/${logId}`, + () => server.get(`logs/${logId}?sortKey=${sortKey}`).json(), + { + staleTime: 1000 * 60 * 5, // 5 min + ...options, + }, + ); + }, + useRotateTeamApiKey() { + return useMutation(async () => + server(`team/apiKey`, { + method: 'PATCH', + }).json(), + ); + }, + useSendTeamInvite() { + return useMutation( + async ({ name, email }) => + server(`team`, { + method: 'POST', + json: { + name, + email, + }, + }).json(), + ); + }, + useInstallation() { + return useQuery(`installation`, () => + server(`installation`).json(), + ); + }, + useMe() { + return useQuery(`me`, () => server(`me`).json()); + }, + useTeam() { + return useQuery(`team`, () => server(`team`).json(), { + retry: 1, + }); + }, + useSaveWebhook() { + return useMutation< + any, + HTTPError, + { service: string; url: string; name: string } + >(async ({ service, url, name }) => + server(`webhooks`, { + method: 'POST', + json: { + name, + service, + url, + }, + }).json(), + ); + }, + useWebhooks(service: string) { + return useQuery({ + queryKey: [service], + queryFn: () => + server('webhooks', { + method: 'GET', + searchParams: [['service', service]], + }).json(), + }); + }, + useDeleteWebhook() { + return useMutation(async ({ id }) => + server(`webhooks/${id}`, { + method: 'DELETE', + }).json(), + ); + }, +}; +export default api; diff --git a/packages/app/src/config.ts b/packages/app/src/config.ts new file mode 100644 index 00000000..05d144b0 --- /dev/null +++ b/packages/app/src/config.ts @@ -0,0 +1,10 @@ +export const API_SERVER_URL = + process.env.NEXT_PUBLIC_API_SERVER_URL ?? 'http://localhost:8000'; + +export const HDX_API_KEY = process.env.NEXT_PUBLIC_HDX_API_KEY as string; +export const HDX_SERVICE_NAME = + process.env.NEXT_PUBLIC_HDX_SERVICE_NAME ?? 'hdx-oss-dev-app'; +export const HDX_COLLECTOR_URL = process.env + .NEXT_PUBLIC_HDX_COLLECTOR_URL as string; + +export const IS_OSS = process.env.NEXT_PUBLIC_IS_OSS ?? 'true' === 'true'; diff --git a/packages/app/src/curlGenerator.ts b/packages/app/src/curlGenerator.ts new file mode 100644 index 00000000..053721b3 --- /dev/null +++ b/packages/app/src/curlGenerator.ts @@ -0,0 +1,220 @@ +// From: https://github.com/albertodeago/curl-generator/blob/master/src/main.ts +// Forked to allow multiple headers with the same name + +type StringMap = { [key: string]: string }; + +/** + * Additional options for curl command. + * + * --compressed -> Request compressed response + * --compressed-ssh -> Enable SSH compression + * --fail -> Fail silently (no output at all) on HTTP errors + * --fail-early -> Fail on first transfer error, do not continue + * --head -> Show document info only + * --include -> Include protocol response headers in the output + * --insecure -> Allow insecure server connections when using SSL + * --ipv4 -> Resolve names to IPv4 addresses + * --ipv6 -> Resolve names to IPv6 addresses + * --list-only -> List only mode + * --location -> Follow redirects + * --location-trusted -> Like --location, and send auth to other hosts + * --no-keepalive -> Disable TCP keepalive on the connection + * --show-error -> Show error even when -s is used + * --silent -> Silent mode + * --ssl -> Try SSL/TLS + * --sslv2 -> Use SSLv2 + * --sslv3 -> Use SSLv3 + * --verbose -> Make the operation more talkative + */ +type CurlAdditionalOptions = { + compressed: boolean; + compressedSsh: boolean; + fail: boolean; + failEarly: boolean; + head: boolean; + include: boolean; + insecure: boolean; + ipv4: boolean; + ipv6: boolean; + listOnly: boolean; + location: boolean; + locationTrusted: boolean; + noKeepalive: boolean; + output: string; + showError: boolean; + silent: boolean; + ssl: boolean; + sslv2: boolean; + sslv3: boolean; + verbose: boolean; +}; + +type CurlRequest = { + method?: + | 'GET' + | 'get' + | 'POST' + | 'post' + | 'PUT' + | 'put' + | 'PATCH' + | 'patch' + | 'DELETE' + | 'delete'; + headers?: [string, string][]; + body?: Object | string; + url: string; +}; + +// slash for connecting previous breakup line to current line for running cURL directly in Command Prompt +const slash = ' \\'; +const newLine = '\n'; + +/** + * @param {string} [method] + * @returns {string} + */ +const getCurlMethod = function (method?: string): string { + let result = ''; + if (method) { + const types: StringMap = { + GET: '-X GET', + POST: '-X POST', + PUT: '-X PUT', + PATCH: '-X PATCH', + DELETE: '-X DELETE', + }; + result = ` ${types[method.toUpperCase()]}`; + } + return slash + newLine + result; +}; + +/** + * @param {StringMap} headers + * @returns {string} + */ +const getCurlHeaders = function (headers?: [string, string][]): string { + let result = ''; + if (headers) { + headers.map(([name, val]) => { + result += `${slash}${newLine}-H "${name}: ${val.replace( + /(\\|")/g, + '\\$1', + )}"`; + }); + } + return result; +}; + +/** + * @param {Object} body + * @returns {string} + */ +const getCurlBody = function (body?: Object): string { + let result = ''; + if (body) { + result += `${slash}${newLine}-d "${JSON.stringify(body).replace( + /(\\|")/g, + '\\$1', + )}"`; + } + return result; +}; + +// From chrome dev tools +// https://github.com/ChromeDevTools/devtools-frontend/blob/d12637511c19e5a3d060656eeb54e76e410715ca/front_end/panels/network/NetworkLogView.ts#L2193 +// TODO: Support windows +function escapeStringPosix(str: string): string { + function escapeCharacter(x: string): string { + const code = x.charCodeAt(0); + let hexString = code.toString(16); + // Zero pad to four digits to comply with ANSI-C Quoting: + // http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html + while (hexString.length < 4) { + hexString = '0' + hexString; + } + + return '\\u' + hexString; + } + + // eslint-disable-next-line no-control-regex, no-useless-escape + if (/[\0-\x1F\x7F-\x9F!]|\'/.test(str)) { + // Use ANSI-C quoting syntax. + return ( + "$'" + + str + .replace(/\\/g, '\\\\') + // eslint-disable-next-line no-useless-escape + .replace(/\'/g, "\\'") + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + // eslint-disable-next-line no-control-regex + .replace(/[\0-\x1F\x7F-\x9F!]/g, escapeCharacter) + + "'" + ); + } + // Use single quote syntax. + return "'" + str + "'"; +} + +const getCurlBodyString = function (body?: string): string { + let result = ''; + if (body) { + result += `${slash}${newLine}--data-raw ${escapeStringPosix(body)}`; + } + return result; +}; + +/** + * Given the curl additional options, turn them into curl syntax + * @param {CurlAdditionalOptions} [options] + * @returns {string} + */ +const getCurlOptions = function (options?: CurlAdditionalOptions): string { + let result = ''; + if (options) { + (Object.keys(options) as Array).forEach( + (key: keyof CurlAdditionalOptions) => { + const kebabKey = key.replace( + /[A-Z]/g, + letter => `-${letter.toLowerCase()}`, + ); + + if (!options[key]) { + throw new Error(`Invalid Curl option ${key}`); + } else if (typeof options[key] === 'boolean' && options[key]) { + // boolean option, we just add --opt + result += `--${kebabKey} `; + } else if (typeof options[key] === 'string') { + // string option, we have to add --opt=value + result += `--${kebabKey} ${options[key]} `; + } + }, + ); + } + + return result ? `${slash}${newLine}${result}` : result; +}; + +/** + * @param {CurlRequest} params + * @param {CurlAdditionalOptions} [options] + * @returns {string} + */ +const CurlGenerator = function ( + params: CurlRequest, + options?: CurlAdditionalOptions, +): string { + let curlSnippet = 'curl '; + curlSnippet += params.url; + curlSnippet += getCurlMethod(params.method); + curlSnippet += getCurlHeaders(params.headers); + curlSnippet += + typeof params.body === 'string' + ? getCurlBodyString(params.body) + : getCurlBody(params.body); + curlSnippet += getCurlOptions(options); + return curlSnippet.trim(); +}; + +export { CurlGenerator }; diff --git a/packages/app/src/nextra.config.tsx b/packages/app/src/nextra.config.tsx new file mode 100644 index 00000000..07542f1b --- /dev/null +++ b/packages/app/src/nextra.config.tsx @@ -0,0 +1,27 @@ +import React from 'react'; + +import Logo from './Logo'; +import NextraMain from './NextraMain'; +import useNextraSeoProps from './useNextraSeoProps'; + +const theme = { + useNextSeoProps: useNextraSeoProps, + logo: , + footer: { + text: 'Made with ♥ in San Francisco, © 2023 DeploySentinel, Inc.', + }, + head: null, + editLink: { + component: null, + }, + darkMode: false, + feedback: { content: null }, + nextThemes: { + forcedTheme: 'dark', + defaultTheme: 'dark', + }, + components: {}, + main: NextraMain, + gitTimestamp: null, +}; +export default theme; diff --git a/packages/app/src/queryv2.ts b/packages/app/src/queryv2.ts new file mode 100644 index 00000000..25d71047 --- /dev/null +++ b/packages/app/src/queryv2.ts @@ -0,0 +1,323 @@ +import lucene from '@hyperdx/lucene'; + +function encodeSpecialTokens(query: string): string { + return query + .replace('http://', 'http_COLON_//') + .replace('https://', 'https_COLON_//') + .replace(/localhost:(\d{1,5})/, 'localhost_COLON_$1') + .replace(/\\:/g, 'HDX_COLON'); +} +function decodeSpecialTokens(query: string): string { + return query + .replace('http_COLON_//', 'http://') + .replace('https_COLON_//', 'https://') + .replace(/localhost_COLON_(\d{1,5})/, 'localhost:$1') + .replace(/HDX_COLON/g, ':'); +} + +export function parse(query: string): lucene.AST { + return lucene.parse(encodeSpecialTokens(query)); +} + +const IMPLICIT_FIELD = ''; + +interface Serializer { + eq(field: string, term: string, isNegatedField: boolean): Promise; + isNotNull(field: string, isNegatedField: boolean): Promise; + gte(field: string, term: string): Promise; + lte(field: string, term: string): Promise; + lt(field: string, term: string): Promise; + gt(field: string, term: string): Promise; + // ilike(field: string, term: string, isNegatedField: boolean): Promise; + fieldSearch( + field: string, + term: string, + isNegatedField: boolean, + prefixWildcard: boolean, + suffixWildcard: boolean, + ): Promise; + range( + field: string, + start: string, + end: string, + isNegatedField: boolean, + ): Promise; +} + +class EnglishSerializer implements Serializer { + private translateField(field: string) { + if (field === IMPLICIT_FIELD) { + return 'event'; + } + + return `'${field}'`; + } + + async eq(field: string, term: string, isNegatedField: boolean) { + return `${this.translateField(field)} ${ + isNegatedField ? 'is not' : 'is' + } ${term}`; + } + + async isNotNull(field: string, isNegatedField: boolean) { + return `${this.translateField(field)} ${ + isNegatedField ? 'is null' : 'is not null' + }`; + } + + async gte(field: string, term: string) { + return `${this.translateField(field)} is greater than or equal to ${term}`; + } + + async lte(field: string, term: string) { + return `${this.translateField(field)} is less than or equal to ${term}`; + } + + async lt(field: string, term: string) { + return `${this.translateField(field)} is less than ${term}`; + } + + async gt(field: string, term: string) { + return `${this.translateField(field)} is greater than ${term}`; + } + + // async fieldSearch(field: string, term: string, isNegatedField: boolean) { + // return `${this.translateField(field)} ${ + // isNegatedField ? 'does not contain' : 'contains' + // } ${term}`; + // } + + async fieldSearch( + field: string, + term: string, + isNegatedField: boolean, + prefixWildcard: boolean, + suffixWildcard: boolean, + ) { + if (field === IMPLICIT_FIELD) { + return `${this.translateField(field)} ${ + prefixWildcard && suffixWildcard + ? isNegatedField + ? 'does not contain' + : 'contains' + : prefixWildcard + ? isNegatedField + ? 'does not end with' + : 'ends with' + : suffixWildcard + ? isNegatedField + ? 'does not start with' + : 'starts with' + : isNegatedField + ? 'does not have whole word' + : 'has whole word' + } ${term}`; + } else { + return `${this.translateField(field)} ${ + isNegatedField ? 'does not contain' : 'contains' + } ${term}`; + } + } + + async range( + field: string, + start: string, + end: string, + isNegatedField: boolean, + ) { + return `${field} ${ + isNegatedField ? 'is not' : 'is' + } between ${start} and ${end}`; + } +} + +async function nodeTerm( + node: lucene.Node, + serializer: Serializer, +): Promise { + const field = node.field[0] === '-' ? node.field.slice(1) : node.field; + let isNegatedField = node.field[0] === '-'; + const isImplicitField = node.field === ''; + + // TODO: Deal with property with ambiguous/multiple types + // let propertyType = propertyTypeMap.get(field); + + // const column: string = field; + // if (customColumnMap[field] != null) { + // column = customColumnMap[field]; + // propertyType = 'string'; + // } else { + // if (propertyType != null) { + // column = buildSearchColumnName(propertyType, field); + // } + // } + + // NodeTerm + if ((node as lucene.NodeTerm).term != null) { + const nodeTerm = node as lucene.NodeTerm; + let term = decodeSpecialTokens(nodeTerm.term); + // We should only negate the search for negated bare terms (ex. '-5') + // This meeans the field is implicit and the prefix is - + if (isImplicitField && nodeTerm.prefix === '-') { + isNegatedField = true; + } + // Otherwise, if we have a negated term for a field (ex. 'level:-5') + // we should not negate the search, and search for -5 + if (!isImplicitField && nodeTerm.prefix === '-') { + term = nodeTerm.prefix + decodeSpecialTokens(nodeTerm.term); + } + + // TODO: Decide if this is good behavior + // If the term is quoted, we should search for the exact term in a property (ex. foo:"bar") + // Implicit field searches should still use substring matching (ex. "foo bar") + if (nodeTerm.quoted && !isImplicitField) { + return serializer.eq(field, term, isNegatedField); + // return SqlString.format(`${column}${isNegatedField ? '!' : ''}=?`, [ + // term, + // ]); + } + + if (!nodeTerm.quoted && term === '*') { + return serializer.isNotNull(field, isNegatedField); + // return `${column} IS ${isNegatedField ? '' : 'NOT '}NULL`; + } + + if (!nodeTerm.quoted && term.substring(0, 2) === '>=') { + if (isNegatedField) { + return serializer.lt(field, term.slice(2)); + } + return serializer.gte(field, term.slice(2)); + } + if (!nodeTerm.quoted && term.substring(0, 2) === '<=') { + if (isNegatedField) { + return serializer.gt(field, term.slice(2)); + } + return serializer.lte(field, term.slice(2)); + // const fn = isNegatedField ? '>' : '<='; + // return `${column} ${fn} ${term.slice(2)}`; + } + if (!nodeTerm.quoted && term[0] === '>') { + if (isNegatedField) { + return serializer.lte(field, term.slice(1)); + } + return serializer.gt(field, term.slice(1)); + // const fn = isNegatedField ? '<=' : '>'; + // return `${column} ${fn} ${term.slice(1)}`; + } + if (!nodeTerm.quoted && term[0] === '<') { + if (isNegatedField) { + return serializer.gte(field, term.slice(1)); + } + return serializer.lt(field, term.slice(1)); + // const fn = isNegatedField ? '>=' : '<'; + // return `${column} ${fn} ${term.slice(1)}`; + } + + let prefixWildcard = false; + let suffixWildcard = false; + if (!nodeTerm.quoted && term[0] === '*') { + prefixWildcard = true; + term = term.slice(1); + } + if (!nodeTerm.quoted && term[term.length - 1] === '*') { + suffixWildcard = true; + term = term.slice(0, -1); + } + + return serializer.fieldSearch( + field, + term, + isNegatedField, + prefixWildcard, + suffixWildcard, + ); + // Bool/Numbers need to be matched with equality operator + // if ( + // !isImplicitField && + // (propertyType === 'number' || propertyType === 'bool') + // ) { + // return serializer.eq(field, term, isNegatedField); + // // return `${column} ${isNegatedField ? '!' : ''}= ${term}`; + // } + + // TODO: Handle regex, similarity, boost, prefix + // return serializer.ilike(field, term, isNegatedField); + // return `(${column} ${isNegatedField ? 'NOT ' : ''}ILIKE '%${term}%')`; + } + // NodeRangedTerm + if ((node as lucene.NodeRangedTerm).inclusive != null) { + const rangedTerm = node as lucene.NodeRangedTerm; + return serializer.range( + field, + rangedTerm.term_min, + rangedTerm.term_max, + isNegatedField, + ); + // return `(${column} ${isNegatedField ? 'NOT ' : ''}BETWEEN ${ + // rangedTerm.term_min + // } AND ${rangedTerm.term_max})`; + } + + throw new Error(`Unexpected Node type. ${node}`); +} + +async function serialize( + ast: lucene.AST | lucene.Node, + serializer: Serializer, + // propertyTypeMap: Map, +): Promise { + // Node Scenarios: + // 1. NodeTerm: Single term ex. "foo:bar" + // 2. NodeRangedTerm: Two terms ex. "foo:[bar TO qux]" + if ((ast as lucene.NodeTerm).term != null) { + return await nodeTerm(ast as lucene.NodeTerm, serializer); + } + if ((ast as lucene.NodeRangedTerm).inclusive != null) { + return await nodeTerm(ast as lucene.NodeTerm, serializer); + } + + // AST Scenarios: + // 1. BinaryAST: Two terms ex. "foo:bar AND baz:qux" + // 2. LeftOnlyAST: Single term ex. "foo:bar" + if ((ast as lucene.BinaryAST).right != null) { + const binaryAST = ast as lucene.BinaryAST; + const operator = + binaryAST.operator === '' ? 'AND' : binaryAST.operator; + const parenthesized = binaryAST.parenthesized; + return `${parenthesized ? '(' : ''}${await serialize( + binaryAST.left, + serializer, + )} ${operator} ${await serialize(binaryAST.right, serializer)}${ + parenthesized ? ')' : '' + }`; + } + + if ((ast as lucene.LeftOnlyAST).left != null) { + const leftOnlyAST = ast as lucene.LeftOnlyAST; + const parenthesized = leftOnlyAST.parenthesized; + // start is used when ex. "NOT foo:bar" + return `${parenthesized ? '(' : ''}${ + leftOnlyAST.start != undefined ? `${leftOnlyAST.start} ` : '' + }${await serialize(leftOnlyAST.left, serializer)}${ + parenthesized ? ')' : '' + }`; + } + + // Blank AST, means no text was parsed + return ''; +} + +export async function genEnglishExplanation(query: string): Promise { + try { + const parsedQ = parse(query); + + if (parsedQ) { + const serializer = new EnglishSerializer(); + return await serialize(parsedQ, serializer); + } + } catch (e) { + console.warn('Parse failure', query, e); + } + + return `Message containing ${query}`; +} diff --git a/packages/app/src/search.ts b/packages/app/src/search.ts new file mode 100644 index 00000000..cbe1fc1a --- /dev/null +++ b/packages/app/src/search.ts @@ -0,0 +1,289 @@ +import { fetchEventSource } from '@microsoft/fetch-event-source'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { UseQueryOptions } from 'react-query'; + +import { API_SERVER_URL } from './config'; +import { usePrevious } from './utils'; + +let team: string | null = null; +try { + team = localStorage?.getItem('hdx_team'); +} catch (e) { + // ignore +} +class RetriableError extends Error {} +class FatalError extends Error {} +class TimeoutError extends Error {} +const EventStreamContentType = 'text/event-stream'; + +function useSearchEventStream( + { + apiUrlPath, + q, + startDate, + endDate, + extraFields, + order, + limit = 100, + onEvent, + onEnd, + resultsKey, + }: { + apiUrlPath: string; + q: string; + startDate: Date; + endDate: Date; + extraFields: string[]; + order: 'asc' | 'desc'; + limit?: number; + onEvent?: (event: any) => void; + onEnd?: (error?: any) => void; + resultsKey?: string; + }, + options?: UseQueryOptions & { + shouldAbortPendingRequest?: boolean; + }, +) { + const enabled = options?.enabled ?? true; + const keepPreviousData = options?.keepPreviousData ?? false; + const shouldAbortPendingRequest = options?.shouldAbortPendingRequest ?? true; + + const [results, setResults] = useState<{ key: string; data: any[] }>({ + key: '', + data: [], + }); + // Set isFetching to true by default + // unless we're not enabled + const [isFetching, setIsFetching] = useState(enabled); + const [hasNextPage, setHasNextPage] = useState(true); + + const lastAbortController = useRef(null); + const [fetchStatus, setFetchStatus] = useState<'fetching' | 'idle'>('idle'); + const lastFetchStatusRef = useRef<'fetching' | 'idle' | undefined>(); + + const fetchResults = useCallback( + async ({ + pageParam = 0, + limit: limitOverride, + }: { + pageParam: number; + limit?: number; + }) => { + const resBuffer: any[] = []; + let linesFetched = 0; + + const startTime = startDate.getTime().toString(); + const endTime = endDate.getTime().toString(); + + const searchParams = new URLSearchParams([ + ['endTime', endTime], + ['q', q], + ['startTime', startTime], + ['order', order], + ['offset', pageParam.toString()], + ['limit', (limitOverride ?? limit).toString()], + ...(team != null ? [['team', team]] : []), + ...extraFields.map(field => ['extraFields[]', field]), + ]); + + const ctrl = new AbortController(); + lastAbortController.current = ctrl; + + setIsFetching(true); + setFetchStatus('fetching'); + lastFetchStatusRef.current = 'fetching'; + + const fetchPromise = fetchEventSource( + `${API_SERVER_URL}${apiUrlPath}?${searchParams.toString()}`, + { + method: 'GET', + signal: ctrl.signal, + credentials: 'include', + async onopen(response) { + if ( + response.ok && + response.headers.get('content-type') === EventStreamContentType + ) { + return; // everything's good + } else if ( + response.status >= 400 && + response.status < 500 && + response.status !== 429 + ) { + // client-side errors are usually non-retriable: + // TODO: handle these??? + throw new FatalError(); + } else { + throw new RetriableError(); + } + }, + onmessage(event) { + if (event.event === '') { + const parsedRows = event.data + .split('\n') + .map((row: string) => { + try { + const parsed = JSON.parse(row); + linesFetched++; + return parsed; + } catch (e) { + return null; + } + }) + .filter((v: any) => v !== null); + + if (onEvent != null) { + parsedRows.forEach(onEvent); + } else if (keepPreviousData) { + resBuffer.push(...parsedRows); + } else { + setResults(prevResults => ({ + key: resultsKey ?? prevResults.key ?? 'DEFAULT_KEY', + data: [...prevResults.data, ...parsedRows], + })); + } + } else if (event.event === 'end') { + onEnd?.(); + + if (keepPreviousData) { + setResults({ + key: resultsKey ?? 'DEFAULT_KEY', + data: resBuffer, + }); + } + + if (linesFetched === 0 || linesFetched < limit) { + setHasNextPage(false); + } + } + }, + onclose() { + ctrl.abort(); + + setIsFetching(false); + setFetchStatus('idle'); + lastFetchStatusRef.current = 'idle'; + // if the server closes the connection unexpectedly, retry: + // throw new RetriableError(); + }, + // onerror(err) { + // if (err instanceof FatalError) { + // throw err; // rethrow to stop the operation + // } else { + // // do nothing to automatically retry. You can also + // // return a specific retry interval here. + // } + // }, + }, + ); + + try { + await Promise.race([ + fetchPromise, + new Promise((_, reject) => { + setTimeout(() => { + reject(new TimeoutError('Timeout')); + }, 90 * 1000); + }), + ]); + } catch (e) { + if (e instanceof TimeoutError) { + setIsFetching(false); + setFetchStatus('idle'); + lastFetchStatusRef.current = 'idle'; + ctrl.abort(); + console.warn('Closing event source due to timeout'); + onEnd?.(new TimeoutError()); + } else { + console.error(e); + } + } + }, + [ + apiUrlPath, + q, + startDate, + endDate, + extraFields, + order, + limit, + keepPreviousData, + setResults, + onEvent, + onEnd, + resultsKey, + ], + ); + + const queryKey = [ + apiUrlPath, + q, + startDate, + endDate, + extraFields, + order, + limit, + ].join('||'); + const prevQueryKey = usePrevious(queryKey); + + useEffect(() => { + // Only attempt fetching on new query keys + if (prevQueryKey != queryKey && enabled) { + if ( + lastFetchStatusRef.current !== 'fetching' || + shouldAbortPendingRequest + ) { + // Abort previous pending request + if ( + shouldAbortPendingRequest && + lastFetchStatusRef.current === 'fetching' + ) { + lastAbortController.current?.abort(); + } + + // Clean up previous results if we shouldn't keep them + if (!keepPreviousData) { + setResults({ key: '', data: [] }); + } + + setHasNextPage(true); + fetchResults({ pageParam: 0 }); + } + } + }, [ + prevQueryKey, + queryKey, + shouldAbortPendingRequest, + fetchResults, + keepPreviousData, + enabled, + ]); + + const fetchNextPage = useCallback( + (params?: { limit?: number }) => { + // Make sure we don't try to fetch again when we're already fetching + // Make sure lastFetchStatusRef is not null, as that means we haven't done an initial fetch yet + if ( + hasNextPage && + lastFetchStatusRef.current === 'idle' && + results.data.length > 0 // make sure we at least fetched initially + ) { + fetchResults({ + pageParam: results.data.length, + limit: params?.limit, + }); + } + }, + [fetchResults, results.data.length, hasNextPage], + ); + + return { + hasNextPage, + isFetching, + results: results.data, + resultsKey: results.key, + fetchNextPage, + }; +} + +export { useSearchEventStream }; diff --git a/packages/app/src/sessionUtils.tsx b/packages/app/src/sessionUtils.tsx new file mode 100644 index 00000000..8ae7f207 --- /dev/null +++ b/packages/app/src/sessionUtils.tsx @@ -0,0 +1,75 @@ +import { useMemo } from 'react'; + +import api from './api'; + +export function useSessionEvents({ + config: { where, dateRange }, +}: { + config: { + where: string; + dateRange: [Date, Date]; + }; +}) { + const { + status, + data: searchResultsPages, + error, + isFetching, + isFetchingNextPage, + isFetchingPreviousPage, + fetchNextPage, + fetchPreviousPage, + hasNextPage, + hasPreviousPage, + } = api.useLogBatch( + { + q: where, + startDate: dateRange?.[0] ?? new Date(), + endDate: dateRange?.[1] ?? new Date(), + extraFields: [ + 'end_timestamp', + 'trace_id', + 'span_id', + 'parent_span_id', + 'http.status_code', + 'http.method', + 'http.url', + 'error.message', + 'location.href', + 'span_name', + 'component', + ], + order: null, + limit: 4000, + }, + { + // mikeshi: Eliminates a memory leak in the DOM Player (not sure why) + cacheTime: 0, + refetchOnWindowFocus: false, + getNextPageParam: (lastPage: any, allPages) => { + if (lastPage.rows === 0) return undefined; + return allPages.flatMap(page => page.data).length; + }, + }, + ); + + const events = useMemo(() => { + return searchResultsPages?.pages + .flatMap(page => page.data) + .map(result => { + return { + ...result, + startOffset: new Date(result.timestamp).getTime(), + endOffset: new Date(result.end_timestamp).getTime(), + // startOffset: isoToNsOffset(result.timestamp), + // endOffset: isoToNsOffset(result.end_timestamp), + }; + }) + .sort((a, b) => parseInt(a.sort_key) - parseInt(b.sort_key)); + }, [searchResultsPages]); + + return { + events, + isFetching, + }; +} diff --git a/packages/app/src/timeQuery.ts b/packages/app/src/timeQuery.ts new file mode 100644 index 00000000..54d041bc --- /dev/null +++ b/packages/app/src/timeQuery.ts @@ -0,0 +1,392 @@ +import { useRouter } from 'next/router'; +import * as chrono from 'chrono-node'; +import { + useQueryParam, + StringParam, + withDefault, + NumberParam, + useQueryParams, +} from 'use-query-params'; +import { useState, useCallback, useEffect, useMemo, useRef } from 'react'; +import { format, sub, startOfSecond } from 'date-fns'; +import { formatInTimeZone } from 'date-fns-tz'; +import { usePrevious } from './utils'; + +const LIVE_TAIL_TIME_QUERY = 'Live Tail'; +const LIVE_TAIL_REFRESH_INTERVAL_MS = 4000; + +const formatDate = ( + date: Date, + isUTC: boolean, + strFormat = 'MMM d HH:mm:ss', +) => { + return isUTC + ? formatInTimeZone(date, 'Etc/UTC', strFormat) + : format(date, strFormat); +}; +export const dateRangeToString = (range: [Date, Date], isUTC: boolean) => { + return `${formatDate(range[0], isUTC)} - ${formatDate(range[1], isUTC)}`; +}; + +function isInputTimeQueryLive(inputTimeQuery: string) { + return inputTimeQuery === '' || inputTimeQuery.includes(LIVE_TAIL_TIME_QUERY); +} + +export function parseTimeQuery( + timeQuery: string, + isUTC: boolean, +): [Date | null, Date | null] { + // If it's a live tail, return the last 15 minutes from now + // Round to the nearest second as when we stop live tail, we'll query up to the nearest second + // Without rounding, we'll end up needing to do a refetch for the ms differences + if (timeQuery.includes(LIVE_TAIL_TIME_QUERY)) { + const end = startOfSecond(new Date()); + return [sub(end, { minutes: 15 }), end]; + } + + const parsedTimeResult = chrono.parse( + timeQuery, + isUTC + ? { + timezone: 0, // 0 minute offset, UTC + } + : {}, + ); + const start = + parsedTimeResult.length === 1 + ? parsedTimeResult[0].start?.date() + : parsedTimeResult.length > 1 + ? parsedTimeResult[1].start?.date() + : null; + const end = + parsedTimeResult.length === 1 && parsedTimeResult[0].end != null + ? parsedTimeResult[0].end.date() + : parsedTimeResult.length > 1 && parsedTimeResult[1].end != null + ? parsedTimeResult[1].end.date() + : start != null && start instanceof Date + ? new Date() + : null; + + return [start, end]; +} + +export function parseValidTimeRange( + timeQuery: string, + isUTC: boolean, +): [Date, Date] | undefined { + const [start, end] = parseTimeQuery(timeQuery, isUTC); + if (start != null && end != null) { + return [start, end]; + } + return undefined; +} + +export function useTimeQuery({ + isUTC, + defaultValue = LIVE_TAIL_TIME_QUERY, + defaultTimeRange = [-1, -1], + isLiveEnabled = true, +}: { + isUTC: boolean; + defaultValue?: string; + defaultTimeRange?: [number, number]; + isLiveEnabled?: boolean; +}) { + const router = useRouter(); + // We need to return true in SSR to prevent mismatch issues + const isReady = typeof window === 'undefined' ? true : router.isReady; + const prevIsReady = usePrevious(isReady); + + const [displayedTimeInputValue, setDisplayedTimeInputValue] = useState< + undefined | string + >(undefined); + + const [_timeRangeQuery, setTimeRangeQuery] = useQueryParams( + { + from: withDefault(NumberParam, undefined), + to: withDefault(NumberParam, undefined), + }, + { + updateType: 'pushIn', + enableBatching: true, + }, + ); + + const timeRangeQuery = useMemo( + () => ({ + from: _timeRangeQuery.from ?? defaultTimeRange[0], + to: _timeRangeQuery.to ?? defaultTimeRange[1], + }), + [_timeRangeQuery, defaultTimeRange], + ); + + // Allow browser back/fwd button to modify the displayed time input value + const [inputTimeQuery, setInputTimeQuery] = useQueryParam( + 'tq', + withDefault(StringParam, ''), + { + updateType: 'pushIn', + enableBatching: true, + }, + ); + const prevInputTimeQuery = usePrevious(inputTimeQuery); + + useEffect(() => { + // Only trigger this once when the qparams have loaded + if (isReady && !prevIsReady) { + if (inputTimeQuery != '') { + setDisplayedTimeInputValue(inputTimeQuery); + } else if (_timeRangeQuery.from != null && _timeRangeQuery.to != null) { + // If we're missing the time range query, let's parse it from the input time query + const timeQueryDerivedInputValue = dateRangeToString( + [new Date(_timeRangeQuery.from), new Date(_timeRangeQuery.to)], + isUTC, + ); + setDisplayedTimeInputValue(timeQueryDerivedInputValue); + setInputTimeQuery(timeQueryDerivedInputValue); + } else { + setDisplayedTimeInputValue(defaultValue); + } + } + }, [ + _timeRangeQuery, + defaultValue, + inputTimeQuery, + isReady, + isUTC, + prevIsReady, + setInputTimeQuery, + setDisplayedTimeInputValue, + ]); + + const [liveTailTimeRange, setLiveTailTimeRange] = useState< + [Date, Date] | undefined + >(undefined); + // XXX: This hack is needed as setTimeRangeQuery doesn't update the query params immediately + // when switching from live -> not live + // this causes us to enter a temporary state where we're not live tailing, + // and liveTailTimeRange is undefined but the timeRangeQuery is [-1, -1] + // We still need to return the last live tail value or else we'll trigger + // unnecessary searches with the wrong time range + const [tempLiveTailTimeRange, setTempLiveTailTimeRange] = useState< + [Date, Date] | undefined + >(undefined); + + const timeQueryDerivedInputValue = + isReady && timeRangeQuery.from != -1 && timeRangeQuery.to != -1 + ? dateRangeToString( + [new Date(timeRangeQuery.from), new Date(timeRangeQuery.to)], + isUTC, + ) + : undefined; + + const inputTimeQueryDerivedTimeQueryRef = useRef<[Date, Date] | undefined>(); + + // When the inputTimeQuery changes, we should calculate the time range + // and set the timeRangeQuery if there is no existing time range query + // if we're not supposed to be in live tail + // Useful for relative time ranges where only tq is provided (ex. ?tq=Past+1d) + useEffect(() => { + if ( + isReady && + !isInputTimeQueryLive(inputTimeQuery) && + prevInputTimeQuery != inputTimeQuery + ) { + const timeRange = parseValidTimeRange(inputTimeQuery, isUTC); + inputTimeQueryDerivedTimeQueryRef.current = timeRange; + + if ( + timeRange != null && + _timeRangeQuery.from == null && + _timeRangeQuery.to == null + ) { + setTimeRangeQuery({ + from: timeRange[0].getTime(), + to: timeRange[1].getTime(), + }); + } + } + }, [ + isReady, + inputTimeQuery, + isUTC, + _timeRangeQuery, + setTimeRangeQuery, + prevInputTimeQuery, + ]); + + // Derive searchedTimeRange + const searchedTimeRange: [Date, Date] = useMemo(() => { + if (isReady && timeRangeQuery.from != -1 && timeRangeQuery.to != -1) { + // If we're ready and there's an existing time query, use that + return [new Date(timeRangeQuery.from), new Date(timeRangeQuery.to)]; + } else if ( + isReady && + timeRangeQuery.from == -1 && + timeRangeQuery.to == -1 && + liveTailTimeRange != null + ) { + // If we're ready, and there's no time query, but we have a live tail time range, use that + return liveTailTimeRange; + } else if ( + isReady && + timeRangeQuery.from == -1 && + timeRangeQuery.to == -1 && + liveTailTimeRange == null && + tempLiveTailTimeRange != null + ) { + // This is a transitive state where timeRangeQuery hasn't been set yet + // since setting qparams is async, but we've already unset liveTailTimeRange + // Transitioning from live -> not live + return tempLiveTailTimeRange; + } else if ( + isReady && + timeRangeQuery.from == -1 && + timeRangeQuery.to == -1 && + liveTailTimeRange == null && + tempLiveTailTimeRange == null && + !isInputTimeQueryLive(inputTimeQuery) && + inputTimeQueryDerivedTimeQueryRef.current != null + ) { + // Use the input time query, allows users to specify relative time ranges + // via url ex. /logs?tq=Last+30+minutes + // return inputTimeQueryDerivedTimeQuery as [Date, Date]; + return inputTimeQueryDerivedTimeQueryRef.current; + } else if ( + isReady && + timeRangeQuery.from == -1 && + timeRangeQuery.to == -1 && + liveTailTimeRange == null && + tempLiveTailTimeRange == null && + isInputTimeQueryLive(inputTimeQuery) + ) { + // If we haven't set a live tail time range yet, but we're ready and should be in live tail, let's just return one right now + // this is due to the first interval of live tail not kicking in until 2 seconds after our first render + const end = startOfSecond(new Date()); + const newLiveTailTimeRange: [Date, Date] = [ + sub(end, { minutes: 15 }), + end, + ]; + return newLiveTailTimeRange; + } else { + // We're not ready yet, safe to return anything. + // Downstream querying components need to be disabled on isReady + return [new Date(), new Date()]; + } + }, [ + isReady, + timeRangeQuery, + liveTailTimeRange, + tempLiveTailTimeRange, + inputTimeQuery, + ]); + + // ====================== LIVE MODE LOGIC ==================================== + // We'll only enter live mode once we're ready and see the qparams are not set + // Live tail is defined by empty time range query, and inputTimeQuery either blank or containing 'Live Tail' + const isLive = useMemo(() => { + return ( + isReady && + isLiveEnabled && + timeRangeQuery.from == -1 && + timeRangeQuery.to == -1 && + (inputTimeQuery == '' || inputTimeQuery.includes(LIVE_TAIL_TIME_QUERY)) + ); + }, [isReady, isLiveEnabled, timeRangeQuery, inputTimeQuery]); + const refreshLiveTailTimeRange = () => { + const end = startOfSecond(new Date()); + setLiveTailTimeRange([sub(end, { minutes: 15 }), end]); + }; + useEffect(() => { + let interval: NodeJS.Timeout | undefined = undefined; + + if (isLive) { + refreshLiveTailTimeRange(); + interval = setInterval( + refreshLiveTailTimeRange, + LIVE_TAIL_REFRESH_INTERVAL_MS, + ); + } + + return () => { + if (interval != null) { + clearInterval(interval); + interval = undefined; + } + }; + }, [isLive]); + const setIsLive = useCallback( + (newIsLive: boolean) => { + if (isLive === false && newIsLive) { + setTempLiveTailTimeRange(undefined); + setTimeRangeQuery({ from: undefined, to: undefined }); + setDisplayedTimeInputValue(LIVE_TAIL_TIME_QUERY); + setInputTimeQuery(LIVE_TAIL_TIME_QUERY); + refreshLiveTailTimeRange(); + } else if (isLive && newIsLive === false && liveTailTimeRange != null) { + const [start, end] = liveTailTimeRange; + setTempLiveTailTimeRange(liveTailTimeRange); + setTimeRangeQuery({ from: start.getTime(), to: end.getTime() }); + setLiveTailTimeRange(undefined); + const dateRangeStr = dateRangeToString([start, end], isUTC); + setDisplayedTimeInputValue(dateRangeStr); + setInputTimeQuery(dateRangeStr); + } + }, + [ + isLive, + setTimeRangeQuery, + setDisplayedTimeInputValue, + liveTailTimeRange, + isUTC, + setInputTimeQuery, + ], + ); + + return { + isReady, // Don't search until we know what we want to do + isLive, + displayedTimeInputValue: + displayedTimeInputValue ?? timeQueryDerivedInputValue ?? defaultValue, + setDisplayedTimeInputValue, + searchedTimeRange, + onSearch: useCallback( + (timeQuery: string) => { + if (timeQuery.includes(LIVE_TAIL_TIME_QUERY)) { + setIsLive(true); + return; + } + + const [start, end] = parseTimeQuery(timeQuery, isUTC); + // TODO: Add validation UI + if (start != null && end != null) { + setTimeRangeQuery({ from: start.getTime(), to: end.getTime() }); + if (timeQuery.toLowerCase().indexOf('past') === -1) { + const dateRangeStr = dateRangeToString([start, end], isUTC); + setDisplayedTimeInputValue(dateRangeStr); + setInputTimeQuery(dateRangeStr); + } else { + setInputTimeQuery(timeQuery); + } + } + }, + [ + isUTC, + setTimeRangeQuery, + setDisplayedTimeInputValue, + setIsLive, + setInputTimeQuery, + ], + ), + onTimeRangeSelect: useCallback( + (start: Date, end: Date) => { + setTimeRangeQuery({ from: start.getTime(), to: end.getTime() }); + const dateRangeStr = dateRangeToString([start, end], isUTC); + setDisplayedTimeInputValue(dateRangeStr); + setInputTimeQuery(dateRangeStr); + }, + [isUTC, setTimeRangeQuery, setDisplayedTimeInputValue, setInputTimeQuery], + ), + setIsLive, + }; +} diff --git a/packages/app/src/types.ts b/packages/app/src/types.ts new file mode 100644 index 00000000..5218232a --- /dev/null +++ b/packages/app/src/types.ts @@ -0,0 +1,91 @@ +export type Team = { + allowedAuthMethods: any[]; + apiKey?: string; + name: string; + users: { + email: string; + hasPasswordAuth: boolean; + isCurrentUser: boolean; + name: string; + }[]; + _id: string; +}; + +export type KeyValuePairs = { + 'bool.names': string[]; + 'bool.values': number[]; + 'number.names': string[]; + 'number.values': number[]; + 'string.names': string[]; + 'string.values': string[]; +}; + +export type LogStreamModel = KeyValuePairs & { + _host?: string; + _namespace?: string; + _platform: string; + _service?: string; + _source: string; // raw log + body: string; + id: string; + observed_timestamp: number; + severity_number: number; + severity_text: string; + span_id?: string; + timestamp: string; + trace_id?: string; +}; + +export type LogView = { + _id: string; + name: string; + query: string; + alerts?: Alert[]; +}; + +export type AlertInterval = + | '1m' + | '5m' + | '15m' + | '30m' + | '1h' + | '6h' + | '12h' + | '1d'; + +export type AlertChannelType = 'webhook'; + +export type AlertChannel = { + channelId?: string; + recipients?: string[]; + severity?: 'critical' | 'error' | 'warning' | 'info'; + type: AlertChannelType; + webhookId?: string; +}; + +export type Alert = { + _id: string; + channel: AlertChannel; + cron: string; + groupBy?: string; + interval: AlertInterval; + logView: string; + message?: string; + state: 'ALERT' | 'OK'; + threshold: number; + timezone: string; + type: 'presence' | 'absence'; +}; + +export type Session = { + errorCount: string; + maxTimestamp: string; + minTimestamp: string; + rrwebEventCount: string; + sessionCount: string; + sessionId: string; + teamId: string; + teamName: string; + userEmail: string; + userName: string; +}; diff --git a/packages/app/src/useNextraSeoProps.ts b/packages/app/src/useNextraSeoProps.ts new file mode 100644 index 00000000..bf640feb --- /dev/null +++ b/packages/app/src/useNextraSeoProps.ts @@ -0,0 +1,41 @@ +import { useConfig } from 'nextra-theme-docs'; +import { useIsBlog, useIsDocs, useIsTerms } from './utils'; + +export default function useNextraSeoProps() { + const isBlog = useIsBlog(); + const isDocs = useIsDocs(); + const isTerms = useIsTerms(); + + const { frontMatter, title } = useConfig(); + + const pageTitleSuffix = isBlog + ? 'HyperDX Blog' + : isDocs + ? 'HyperDX Docs' + : isTerms + ? 'HyperDX' + : ''; + + return { + title: `${frontMatter.title ?? title} - ${pageTitleSuffix}`, + description: frontMatter.summary, + openGraph: { + ...(frontMatter.hero != null + ? { + images: [ + { + url: `https://www.hyperdx.io${frontMatter.hero}`, + alt: 'HyperDX Blog', + type: 'image/png', + }, + ], + } + : {}), + site_name: 'HyperDX', + }, + twitter: { + site: '@hyperdxio', + cardType: 'summary_large_image', + }, + }; +} diff --git a/packages/app/src/useQueryParam.tsx b/packages/app/src/useQueryParam.tsx new file mode 100644 index 00000000..81491bab --- /dev/null +++ b/packages/app/src/useQueryParam.tsx @@ -0,0 +1,101 @@ +import { useRouter } from 'next/router'; +import { + createContext, + useCallback, + useContext, + useEffect, + useState, +} from 'react'; +import { usePrevious } from './utils'; + +type QueryParamContextType = Record & { + setState: (state: any) => void; +}; + +const QueryParamContext = createContext({ + setState: _ => {}, +}); + +export const QueryParamProvider = ({ + children, +}: { + children: React.ReactNode; +}) => { + const router = useRouter(); + + const prevRouterQuery = usePrevious(router.query); + + const setState = useCallback( + (state: Record) => { + setCache(oldCache => { + const newCache = { + ...oldCache, + ...state, + }; + const { setState: _, ...newQuery } = newCache; + + router.push({ + query: newQuery, + }); + + return newCache; + }); + }, + [router], + ); + + const initState: QueryParamContextType = { + setState, + }; + + const [cache, setCache] = useState(initState); + + // Update cache if query param changes + useEffect(() => { + if (router.isReady && prevRouterQuery != router.query) { + setCache(oldCache => ({ ...oldCache, ...router.query })); + } + }, [setState, router.isReady, router.query, cache, prevRouterQuery]); + + return ( + + {children} + + ); +}; + +export function useQueryParam( + key: string, + defaultValue: T, + options: { + queryParamConfig: { + encode: ( + value: T | undefined, + ) => string | (string | null)[] | null | undefined; + decode: ( + input: string | (string | null)[] | null | undefined, + ) => T | undefined; + }; + } = { + queryParamConfig: { + encode: (value: T | undefined) => JSON.stringify(value), + decode: (input: string | (string | null)[] | null | undefined) => + Array.isArray(input) + ? input.map(i => (i != null ? JSON.parse(i) : undefined)) + : input != null + ? JSON.parse(input) + : undefined, + }, + }, +): [T, (value: T) => void] { + const qParamContext = useContext(QueryParamContext); + + const setValue = (value: T) => { + qParamContext.setState({ [key]: options.queryParamConfig.encode(value) }); + }; + + const value = + options.queryParamConfig.decode(qParamContext[key]) ?? defaultValue; + + return [value, setValue]; +} diff --git a/packages/app/src/useUserPreferences.tsx b/packages/app/src/useUserPreferences.tsx new file mode 100644 index 00000000..054417a5 --- /dev/null +++ b/packages/app/src/useUserPreferences.tsx @@ -0,0 +1,36 @@ +import React, { useContext, useState } from 'react'; + +export type TimeFormat = '12h' | '24h'; + +export const UserPreferences = React.createContext({ + isUTC: false, + timeFormat: '24h' as TimeFormat, + setTimeFormat: (timeFormat: TimeFormat) => {}, + setIsUTC: (isUTC: boolean) => {}, +}); + +export const UserPreferencesProvider = ({ + children, +}: { + children: React.ReactNode; +}) => { + const initState = { + isUTC: false, + timeFormat: '24h' as TimeFormat, + setTimeFormat: (timeFormat: TimeFormat) => + setState(state => ({ ...state, timeFormat })), + setIsUTC: (isUTC: boolean) => setState(state => ({ ...state, isUTC })), + }; + + const [state, setState] = useState(initState); + + return ( + + {children} + + ); +}; + +export default function useUserPreferences() { + return useContext(UserPreferences); +} diff --git a/packages/app/src/utils.tsx b/packages/app/src/utils.tsx new file mode 100644 index 00000000..2699e732 --- /dev/null +++ b/packages/app/src/utils.tsx @@ -0,0 +1,395 @@ +import { format as fnsFormat, formatDistanceToNowStrict } from 'date-fns'; +import { useRouter } from 'next/router'; +import { useState, useEffect, useRef } from 'react'; +import Convert from 'ansi-to-html'; + +import type { MutableRefObject } from 'react'; + +import { dateRangeToString } from './timeQuery'; + +export function generateSearchUrl({ + query, + dateRange, + lineId, + isUTC, + savedSearchId, +}: { + savedSearchId?: string; + query?: string; + dateRange?: [Date, Date]; + lineId?: string; + isUTC?: boolean; +}) { + const fromDate = dateRange ? dateRange[0] : new Date(); + const toDate = dateRange ? dateRange[1] : new Date(); + const qparams = new URLSearchParams({ + q: query ?? '', + from: fromDate.getTime().toString(), + to: toDate.getTime().toString(), + tq: dateRangeToString([fromDate, toDate], isUTC ?? false), + ...(lineId ? { lid: lineId } : {}), + }); + return `/search${ + savedSearchId != null ? `/${savedSearchId}` : '' + }?${qparams.toString()}`; +} + +export function useFirstNonNullValue(value: T): T { + const [firstNonNullValue, setFirstNonNullValue] = useState(value); + useEffect(() => { + if (value != null) { + setFirstNonNullValue(v => (v == null ? value : v)); + } + }, [value]); + return firstNonNullValue; +} + +// From: https://usehooks.com/useWindowSize/ +export function useWindowSize() { + // Initialize state with undefined width/height so server and client renders match + // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/ + const [windowSize, setWindowSize] = useState<{ + width: number | undefined; + height: number | undefined; + }>({ + width: undefined, + height: undefined, + }); + useEffect(() => { + // Handler to call on window resize + function handleResize() { + // Set window width/height to state + setWindowSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + } + // Add event listener + window.addEventListener('resize', handleResize); + // Call handler right away so state gets updated with initial window size + handleResize(); + // Remove event listener on cleanup + return () => window.removeEventListener('resize', handleResize); + }, []); // Empty array ensures that effect is only run on mount + return windowSize; +} + +export const isValidUrl = (input: string) => { + try { + new URL(input); + return true; + } catch (err) { + return false; + } +}; + +export const capitalizeFirstLetter = (input: string) => { + return input.charAt(0).toUpperCase() + input.slice(1); +}; + +export const getShortUrl = (url: string) => { + try { + const parsedUrl = new URL(url); + const urlSplit = (parsedUrl.pathname || url) + ?.split('/') + .filter((v: string) => v.length > 0); // Get rid of empty string + let shortUrl = `/${urlSplit[urlSplit.length - 1] ?? url}`; + for (let i = 3; i > 0; i--) { + const urlSuffix = `/${urlSplit.slice(-1 * i).join('/')}`; + if (urlSuffix.length < 25) { + shortUrl = urlSuffix; + break; + } + } + + return shortUrl; + } catch (e) { + return ''; + } +}; + +export const useDebugMode = () => { + const { query } = useRouter(); + + return Boolean(query.debugMode) || Boolean(query.debug); +}; + +const returnFalse = () => false; + +// From: https://usehooks.com/useDebounce/ +export const useDebounce = ( + value: T, + delay: number, + immediate?: (value: T) => boolean, +) => { + // State and setters for debounced value + const [debouncedValue, setDebouncedValue] = useState(value); + const shouldBeImmediate = (immediate ?? returnFalse)(value); + useEffect( + () => { + if (shouldBeImmediate) { + setDebouncedValue(value); + return () => {}; + } + + // Update debounced value after delay + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delay); + // Cancel the timeout if value changes (also on delay change or unmount) + // This is how we prevent debounced value from updating if value is changed ... + // .. within the delay period. Timeout gets cleared and restarted. + return () => { + clearTimeout(handler); + }; + }, + [value, delay, shouldBeImmediate], // Only re-call effect if value or delay changes + ); + if (shouldBeImmediate) { + return value; + } + + return debouncedValue; +}; + +export function useLocalStorage(key: string, initialValue: T) { + // State to store our value + // Pass initial state function to useState so logic is only executed once + const [storedValue, setStoredValue] = useState(initialValue); + + // Fetch the value on client-side to avoid SSR issues + useEffect(() => { + if (typeof window === 'undefined') { + return; + } + try { + // Get from local storage by key + const item = window.localStorage.getItem(key); + // Parse stored json or if none return initialValue + if (item != null) { + setStoredValue(JSON.parse(item)); + } + } catch (error) { + // If error also return initialValue + console.log(error); + } + }, [key]); + + // Return a wrapped version of useState's setter function that ... + // ... persists the new value to localStorage. + const setValue = (value: T | Function) => { + if (typeof window === 'undefined') { + return; + } + try { + // Allow value to be a function so we have same API as useState + const valueToStore = + value instanceof Function ? value(storedValue) : value; + // Save state + setStoredValue(valueToStore); + // Save to local storage + window.localStorage.setItem(key, JSON.stringify(valueToStore)); + } catch (error) { + // A more advanced implementation would handle the error case + console.log(error); + } + }; + return [storedValue, setValue] as const; +} + +export function truncateText( + text: string, + maxLength: number, + suffix?: string, + endPattern?: RegExp, +) { + const patternIndex = endPattern ? text.search(endPattern) : -1; + // Return truncated text at index + if (patternIndex >= 0 && patternIndex < maxLength) { + return text.substring(0, patternIndex) + '...'; + } + + if (text.length <= maxLength) { + return text; + } + return text.substring(0, maxLength) + (suffix ?? '...'); +} + +export function formatDistanceToNowStrictShort(date: Date) { + return formatDistanceToNowStrict(date) + .replace(' month', 'mo.') + .replace(' days', 'd') + .replace(' day', 'd') + .replace(' hours', 'h') + .replace(' hour', 'h') + .replace(' minutes', 'm') + .replace(' minute', 'm') + .replace(' seconds', 's'); +} + +export function formatHumanReadableDate(date: Date) { + return fnsFormat(date, 'MMMM d, h:mmaaa'); +} + +export const getLogLevelClass = (lvl: string | undefined) => { + const level = lvl?.toLowerCase(); + if (level == null) { + return undefined; + } + + return level.startsWith('emerg') || + level.startsWith('alert') || + level.startsWith('crit') || + level.startsWith('err') || + level.startsWith('fatal') + ? 'error' + : level.startsWith('warn') + ? 'warn' + : level.startsWith('info') || + level.startsWith('debug') || + level.startsWith('ok') || + level.startsWith('notice') || + level.startsWith('verbose') || + level.startsWith('trace') + ? 'info' + : undefined; +}; + +const COLORS = [ + '#d5dade', // White + '#20c997', // Green + '#0dcaf0', // Turqoise + '#8250dc', // Light Purple + '#cdad7a', // Tan + '#6610f2', // Purple + '#0d6efd', // Blue + '#fd7e14', // Orange + '#828c95', // Grey + '#ff9382', // Coral + '#39b5ab', // Olive-tealish? + '#ffa600', // Yellow + // '#d63384', // Magenta, too close to red +]; +export function hashCode(str: string) { + let hash = 0, + i, + chr; + if (str.length === 0) return hash; + for (i = 0; i < str.length; i++) { + chr = str.charCodeAt(i); + hash = (hash << 5) - hash + chr; + hash |= 0; // Convert to 32bit integer + } + return hash; +} + +const keyedColor = (key: string | number | undefined) => { + const num = Math.floor(Math.abs(hashCode(`${key}` ?? ''))); + return COLORS[num % COLORS.length]; +}; + +// Try to match log levels to colors +export const semanticKeyedColor = (key: string | number | undefined) => { + const logLevel = getLogLevelClass(`${key}`); + if (logLevel != null) { + return logLevel === 'error' + ? '#d63384' // magenta + : logLevel === 'warn' + ? '#ffc107' // yellow + : '#20c997'; // green; + } + + return keyedColor(key); +}; + +export const truncateMiddle = (str: string, maxLen = 10) => { + if (str.length <= maxLen) { + return str; + } + return `${str.slice(0, (maxLen - 2) / 2)}..${str.slice( + (-1 * (maxLen - 2)) / 2, + )}`; +}; + +export const useIsBlog = () => { + const router = useRouter(); + return router?.pathname.startsWith('/blog'); +}; + +export const useIsDocs = () => { + const router = useRouter(); + return router?.pathname.startsWith('/docs'); +}; + +export const useIsTerms = () => { + const router = useRouter(); + return router?.pathname.startsWith('/terms'); +}; + +export const usePrevious = (value: T): T | undefined => { + const ref = useRef(); + useEffect(() => { + ref.current = value; + }); + return ref.current; +}; + +// From https://javascript.plainenglish.io/how-to-make-a-simple-custom-usedrag-react-hook-6b606d45d353 +export const useDrag = ( + ref: MutableRefObject, + deps = [], + options: { + onDrag?: (e: PointerEvent) => any; + onPointerDown?: (e: PointerEvent) => any; + onPointerUp?: (e: PointerEvent) => any; + onPointerMove?: (e: PointerEvent) => any; + }, +) => { + const { + onPointerDown = () => {}, + onPointerUp = () => {}, + onPointerMove = () => {}, + onDrag = () => {}, + } = options; + + const [isDragging, setIsDragging] = useState(false); + + const handlePointerDown = (e: PointerEvent) => { + setIsDragging(true); + + onPointerDown(e); + }; + + const handlePointerUp = (e: PointerEvent) => { + setIsDragging(false); + + onPointerUp(e); + }; + + const handlePointerMove = (e: PointerEvent) => { + onPointerMove(e); + + if (isDragging) { + onDrag(e); + } + }; + + useEffect(() => { + const element = ref.current; + if (element) { + element.addEventListener('pointerdown', handlePointerDown); + element.addEventListener('pointerup', handlePointerUp); + element.addEventListener('pointermove', handlePointerMove); + + return () => { + element.removeEventListener('pointerdown', handlePointerDown); + element.removeEventListener('pointerup', handlePointerUp); + element.removeEventListener('pointermove', handlePointerMove); + }; + } + + return () => {}; + }, [...deps, isDragging]); + + return { isDragging }; +}; diff --git a/packages/app/src/vsc-dark-plus.ts b/packages/app/src/vsc-dark-plus.ts new file mode 100644 index 00000000..257bfb25 --- /dev/null +++ b/packages/app/src/vsc-dark-plus.ts @@ -0,0 +1,297 @@ +const styles = { + 'pre[class*="language-"]': { + color: '#d4d4d4', + fontSize: '13px', + textShadow: 'none', + fontFamily: + 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace', + direction: 'ltr', + textAlign: 'left', + whiteSpace: 'pre', + wordSpacing: 'normal', + wordBreak: 'normal', + lineHeight: '1.5', + MozTabSize: '4', + OTabSize: '4', + tabSize: '4', + WebkitHyphens: 'none', + MozHyphens: 'none', + msHyphens: 'none', + hyphens: 'none', + padding: '1em', + margin: '.5em 0', + overflow: 'auto', + background: '#1e1e1e', + }, + 'code[class*="language-"]': { + color: '#d4d4d4', + fontSize: '13px', + textShadow: 'none', + fontFamily: + 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace', + direction: 'ltr', + textAlign: 'left', + whiteSpace: 'pre', + wordSpacing: 'normal', + wordBreak: 'normal', + lineHeight: '1.5', + MozTabSize: '4', + OTabSize: '4', + tabSize: '4', + WebkitHyphens: 'none', + MozHyphens: 'none', + msHyphens: 'none', + hyphens: 'none', + }, + 'pre[class*="language-"]::selection': { + textShadow: 'none', + background: '#75a7ca', + }, + 'code[class*="language-"]::selection': { + textShadow: 'none', + background: '#75a7ca', + }, + 'pre[class*="language-"] *::selection': { + textShadow: 'none', + background: '#75a7ca', + }, + 'code[class*="language-"] *::selection': { + textShadow: 'none', + background: '#75a7ca', + }, + ':not(pre) > code[class*="language-"]': { + padding: '.1em .3em', + borderRadius: '.3em', + color: '#db4c69', + background: '#f9f2f4', + }, + '.namespace': { + Opacity: '.7', + }, + 'doctype.doctype-tag': { + color: '#569CD6', + }, + 'doctype.name': { + color: '#9cdcfe', + }, + comment: { + color: '#6a9955', + }, + prolog: { + color: '#6a9955', + }, + punctuation: { + color: '#d4d4d4', + }, + '.language-html .language-css .token.punctuation': { + color: '#d4d4d4', + }, + '.language-html .language-javascript .token.punctuation': { + color: '#d4d4d4', + }, + property: { + color: '#9cdcfe', + }, + tag: { + color: '#569cd6', + }, + boolean: { + color: '#569cd6', + }, + number: { + color: '#b5cea8', + }, + constant: { + color: '#9cdcfe', + }, + symbol: { + color: '#b5cea8', + }, + inserted: { + color: '#b5cea8', + }, + unit: { + color: '#b5cea8', + }, + selector: { + color: '#d7ba7d', + }, + 'attr-name': { + color: '#9cdcfe', + }, + string: { + color: '#ce9178', + }, + char: { + color: '#ce9178', + }, + builtin: { + color: '#ce9178', + }, + deleted: { + color: '#ce9178', + }, + '.language-css .token.string.url': { + textDecoration: 'underline', + }, + operator: { + color: '#d4d4d4', + }, + entity: { + color: '#569cd6', + }, + 'operator.arrow': { + color: '#569CD6', + }, + atrule: { + color: '#ce9178', + }, + 'atrule.rule': { + color: '#c586c0', + }, + 'atrule.url': { + color: '#9cdcfe', + }, + 'atrule.url.function': { + color: '#dcdcaa', + }, + 'atrule.url.punctuation': { + color: '#d4d4d4', + }, + keyword: { + color: '#569CD6', + }, + 'keyword.module': { + color: '#c586c0', + }, + 'keyword.control-flow': { + color: '#c586c0', + }, + function: { + color: '#dcdcaa', + }, + 'function.maybe-class-name': { + color: '#dcdcaa', + }, + regex: { + color: '#d16969', + }, + important: { + color: '#569cd6', + }, + italic: { + fontStyle: 'italic', + }, + 'class-name': { + color: '#4ec9b0', + }, + 'maybe-class-name': { + color: '#4ec9b0', + }, + console: { + color: '#9cdcfe', + }, + parameter: { + color: '#9cdcfe', + }, + interpolation: { + color: '#9cdcfe', + }, + 'punctuation.interpolation-punctuation': { + color: '#569cd6', + }, + variable: { + color: '#9cdcfe', + }, + 'imports.maybe-class-name': { + color: '#9cdcfe', + }, + 'exports.maybe-class-name': { + color: '#9cdcfe', + }, + escape: { + color: '#d7ba7d', + }, + 'tag.punctuation': { + color: '#808080', + }, + cdata: { + color: '#808080', + }, + 'attr-value': { + color: '#ce9178', + }, + 'attr-value.punctuation': { + color: '#ce9178', + }, + 'attr-value.punctuation.attr-equals': { + color: '#d4d4d4', + }, + namespace: { + color: '#4ec9b0', + }, + 'pre[class*="language-javascript"]': { + color: '#9cdcfe', + }, + 'code[class*="language-javascript"]': { + color: '#9cdcfe', + }, + 'pre[class*="language-jsx"]': { + color: '#9cdcfe', + }, + 'code[class*="language-jsx"]': { + color: '#9cdcfe', + }, + 'pre[class*="language-typescript"]': { + color: '#9cdcfe', + }, + 'code[class*="language-typescript"]': { + color: '#9cdcfe', + }, + 'pre[class*="language-tsx"]': { + color: '#9cdcfe', + }, + 'code[class*="language-tsx"]': { + color: '#9cdcfe', + }, + 'pre[class*="language-css"]': { + color: '#ce9178', + }, + 'code[class*="language-css"]': { + color: '#ce9178', + }, + 'pre[class*="language-html"]': { + color: '#d4d4d4', + }, + 'code[class*="language-html"]': { + color: '#d4d4d4', + }, + '.language-regex .token.anchor': { + color: '#dcdcaa', + }, + '.language-html .token.punctuation': { + color: '#808080', + }, + 'pre[data-line]': { + position: 'relative', + }, + 'pre[class*="language-"] > code[class*="language-"]': { + position: 'relative', + zIndex: '1', + }, + '.line-highlight': { + position: 'absolute', + left: '0', + right: '0', + padding: 'inherit 0', + marginTop: '1em', + background: '#f7ebc6', + boxShadow: 'inset 5px 0 0 #f7d87c', + zIndex: '0', + pointerEvents: 'none', + lineHeight: 'inherit', + whiteSpace: 'pre', + }, +}; + +export default styles; diff --git a/packages/app/src/zIndex.ts b/packages/app/src/zIndex.ts new file mode 100644 index 00000000..254bfaf1 --- /dev/null +++ b/packages/app/src/zIndex.ts @@ -0,0 +1,8 @@ +import { createContext, useContext } from 'react'; + +export const ZIndexContext = createContext(0); + +export function useZIndex() { + const zIndex = useContext(ZIndexContext); + return zIndex; +} diff --git a/packages/app/styles/Home.module.css b/packages/app/styles/Home.module.css new file mode 100644 index 00000000..35454bb7 --- /dev/null +++ b/packages/app/styles/Home.module.css @@ -0,0 +1,121 @@ +.container { + min-height: 100vh; + padding: 0 0.5rem; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100vh; +} + +.main { + padding: 5rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + width: 100%; + height: 100px; + border-top: 1px solid #eaeaea; + display: flex; + justify-content: center; + align-items: center; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; + flex-grow: 1; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; + margin-top: 3rem; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + width: 45%; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/packages/app/styles/app.scss b/packages/app/styles/app.scss new file mode 100644 index 00000000..c45f8df6 --- /dev/null +++ b/packages/app/styles/app.scss @@ -0,0 +1,780 @@ +$text-muted: #c4c4c4; +$text-purple: #9357ff; // This isn't a bootstrap variable +$text-light: #f8f8f2; +$green: #50fa7b; +$red: #ff5d5b; +$blue: #3788f6; +$purple: #8f57f3; + +$gray-100: #f8f9fa; +$body-color: $gray-100; + +$bg-hdx-dark: #1a1d23; +$bg-dark-grey: #1f2429; +$bg-grey: #21272e; +$bg-purple: #2e273b; +$bg-purple-active: #4a4eb5; +$body-bg: #0f1216; +$code-color: #4bb74a; + +$info: $purple; + +$spacer: 1rem; +$spacers: ( + 0: 0, + 0\.5: $spacer * 0.125, + 1: $spacer * 0.25, + 2: $spacer * 0.5, + 2\.5: $spacer * 0.75, + 3: $spacer, + 4: $spacer * 1.5, + 4\.5: $spacer * 2, + 5: $spacer * 3, + 6: $spacer * 4, + 7: $spacer * 5, + 8: $spacer * 8, + 10: $spacer * 10, + 14: $spacer * 14, + 16: $spacer * 16, +); + +$navbar-dark-active-color: $green; +$navbar-dark-color: rgba(#fff, 0.75); +$navbar-dark-hover-color: rgba(#fff, 1); + +$dropdown-dark-bg: $bg-grey; + +$popover-bg: $bg-purple; + +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` + +$h1-font-size: $font-size-base * 2.5 !default; +$h2-font-size: $font-size-base * 2 !default; +$h3-font-size: $font-size-base * 1.75 !default; +$h4-font-size: $font-size-base * 1.5 !default; +$h5-font-size: $font-size-base * 1.25 !default; +$h6-font-size: $font-size-base !default; +// scss-docs-end font-variables + +// scss-docs-start font-sizes +$font-sizes: ( + 1: $h1-font-size, + 2: $h2-font-size, + 3: $h3-font-size, + 4: $h4-font-size, + 5: $h5-font-size, + 5\.5: $font-size-base * 1.125, + 6: $h6-font-size, + 7: $font-size-base * 0.875, + 7\.5: $font-size-base * 0.8125, + 8: $font-size-base * 0.75, + 8\.5: $font-size-base * 0.625, + 9: $font-size-base * 0.5, +) !default; +// scss-docs-end font-sizes + +$input-bg: #ffffff1a; +$input-border-width: 0px; +$input-group-addon-bg: $input-bg; + +$form-select-indicator-color: $body-color; + +$accordion-button-bg: $bg-purple; +$accordion-button-active-bg: $bg-purple-active; +$accordion-button-active-color: $body-color; +$accordion-bg: $body-bg; +$accordion-border-radius: 5px; + +@import '~bootstrap/scss/bootstrap'; +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;700&display=swap'); + +.inter { + font-family: Inter, Roboto, 'Helvetica Neue', sans-serif; +} +.roboto { + font-family: 'Roboto', sans-serif; +} +.mono { + font-family: 'IBM Plex Mono', monospace; +} + +html, +body, +html[class~='dark'] body { + background-color: $body-bg; +} +.bg-body { + background-color: $body-bg; +} +.bg-hdx-dark { + background-color: $bg-hdx-dark; +} + +.bg-grey { + background-color: $bg-grey; +} + +.bg-light-grey { + background-color: #37414d; +} +.bg-light-grey-hover { + background-color: #37414d; + &:hover { + background-color: #4e5c6d; + } +} + +.bg-inherit { + background-color: inherit; +} + +.bg-dark-grey { + background-color: $bg-dark-grey; +} +.bg-default-dark-grey-hover { + &:hover { + background-color: $bg-dark-grey; + } +} + +.border-grey-top { + border-top: 1px solid #393939; +} +.border-grey-bottom { + border-bottom: 1px solid #393939; +} +.border-grey { + border-color: #393939 !important; +} +.border-grey-gradient { + box-shadow: 0 0 0 1px rgb(82 82 82 / 60%); +} + +.fw-500 { + font-weight: 500; +} + +// Darker than text-muted +.text-gray-600 { + color: $gray-600; +} + +.text-muted-hover { + color: $text-muted; + transition: color 0.2s ease; + &:hover { + color: #e5e5e5; + } +} + +.text-muted-hover-black { + color: $text-muted; + transition: color 0.2s ease; + &:hover { + color: black; + } +} + +.text-white-hover { + color: $white; + transition: color 0.2s ease; + &:hover { + color: $text-muted; + } +} + +.text-white-hover-green { + color: $white; + transition: color 0.2s ease; + &:hover { + color: $green; + } +} + +.text-purple-hover { + color: $text-purple; + transition: color 0.2s ease; + &:hover { + color: darken($text-purple, 5); + } +} + +.text-white-hover-success-trigger { + transition: color 0.2s ease; + .child-hover-trigger { + color: $white; + } + &:hover .child-hover-trigger { + color: $green; + } +} + +:root { + --toastify-toast-width: 400px; + color-scheme: dark; +} + +body { + font-family: 'IBM Plex Mono', monospace; + font-size: $font-size-base * 0.875; +} + +.accordion-button, +.button, +.form-control { + &:focus { + outline: none; + box-shadow: none; + } +} + +.cursor-pointer { + cursor: pointer; +} + +.cursor-grab { + cursor: grab; +} + +.cursor-zoom-in { + cursor: zoom-in !important; +} + +.cursor-crosshair { + cursor: crosshair !important; +} + +.nav-link.active { + font-weight: 500; +} + +.btn-brand-primary { + // @include button-variant(#fff, #8256d0, #ffffff00); + @include button-variant($purple, #ffffff00, white); + background-image: linear-gradient( + 89.91deg, + $purple 0.06%, + #245ab2 99.9% + ) !important; + border: 0; + font-weight: 500; + box-shadow: 0px 0px 10px 0px #8256d0b2; + + transition: opacity 0.2s; + + &:hover { + opacity: 0.9; + border: 0; + } + &:focus { + box-shadow: none; + } +} +.btn-outline-brand-primary { + // @include button-outline-variant(white, white, #8256d0, #8256d0); + position: relative; + + $border: 2px; + color: #fff; + background: $body-bg; + background-clip: padding-box; /* !importanté */ + border: solid $border transparent; /* !importanté */ + + &:hover { + color: $text-muted; + &:before { + background: $purple; + } + } + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: -$border; /* !importanté */ + border-radius: inherit; /* !importanté */ + background: linear-gradient(89.91deg, $purple 0.06%, #245ab2 99.9%); + z-index: -1; + } + + .btn-check:focus + &, + &:focus { + box-shadow: 0 0 0 $btn-focus-width rgba($purple, 0.5); + } +} +.btn-dark { + background: #151515af; + &:hover { + background: #4d4d4d; + } +} + +.outline-green-gradient { + position: relative; + + $border: 1px; + background-clip: padding-box; /* !importanté */ + border: solid $border transparent; /* !importanté */ + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: -$border; /* !importanté */ + border-radius: inherit; /* !importanté */ + background: linear-gradient( + 300.9deg, + rgba(255, 255, 255, 0.1) 0%, + rgba(0, 202, 51, 0.144) 100% + ); + z-index: -1; + } +} + +.primary-text { + background: linear-gradient(91.75deg, $purple 2.76%, #317bf5 93.09%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.fs-0 { + @include font-size(3rem); + @include rfs(3.5rem, line-height); + // @include font-size(3rem); + // font-size: 48px; +} + +.bg-purple { + background-color: $bg-purple; +} +.bg-purple-active { + background-color: $bg-purple-active; +} +.bg-warning-transparent { + background-color: rgba($yellow, 0.15); +} +.bg-danger-transparent { + background-color: rgba($red, 0.15); +} + +.transition-width { + transition: width 0.2s ease-in-out; +} + +.transition-height { + transition: height 0.2s ease-in-out; +} + +.min-height-65vh { + min-height: 65vh; +} + +.gradient-divider { + height: 1px; + background: radial-gradient( + 50% 243.6% at 50% 50%, + #3788f6 0%, + rgba(130, 86, 208, 0) 100% + ); + opacity: 0.6; + transform: matrix(1, 0, 0, -1, 0, 0); +} + +.opacity-90 { + opacity: 0.9; +} + +.rotate-90 { + transform: rotate(90deg); +} + +.rounded-10 { + border-radius: 25px; +} + +/* Overwrite boostrap table */ +.table > :not(:first-child) { + border-top: none; +} +.table th { + font-weight: 500; +} +.table-dark { + --bs-table-bg: transparent; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #373b3e; +} + +/* Custom Components */ + +// Make sure the rrweb mouse doesn't obscure elements below it for the inspector +.replayer-mouse { + pointer-events: none; +} + +.shimmer { + // animation : shimmer 1.5s infinite; + // background: linear-gradient(to right, #d8d8d8 4%, #a5a5a5 25%, #aaadaf 36%); + animation: shimmer-animation 3s infinite linear; + background: linear-gradient(270deg, #333 4%, #111 25%, #333 36%); + background-size: 1000px 100%; +} +@keyframes shimmer-animation { + 0% { + // background-position: top left; + background-position: -1000px 0; + // background-position: -1000px 0; + } + 100% { + // background-position: top right; + background-position: 1000px 0; + } +} + +.spin-animate { + animation: spin 0.8s infinite linear; +} +@keyframes spin { + 0% { + transform: scale(1) rotate(0deg); + } + 40% { + transform: scale(1) rotate(160deg); + } + 60% { + transform: scale(1) rotate(200deg); + } + 100% { + transform: scale(1) rotate(360deg); + } +} + +.PlaybarSliderParent { + &:hover { + .PlaybarSlider { + height: 12px; + + .thumb { + margin-top: -3px; + height: 18px; + width: 18px; + } + + .mark { + margin-top: 0px; + width: 12px; + height: 12px; + margin-left: 6px; + } + } + } + + .PlaybarSlider { + transition: height 0.2s ease-in-out; + height: 6px; + + .thumb { + transition: all 0.2s ease-in-out; + + margin-top: -5px; + height: 16px; + width: 16px; + } + + .mark { + transition: all 0.2s ease-in-out; + + width: 8px; + height: 8px; + margin-top: -1px; + margin-left: -4px; + } + } +} + +// Just for the price slider +.PricingSlider { + height: 25px; + .thumb { + margin-top: -6px; + } +} + +.TimelineView { + svg { + overflow: visible; + } +} + +.TimelineEventTooltip { + .tooltip { + z-index: 9999 !important; + } + .tooltip-inner { + max-width: 300px; + background: $bg-purple-active; + } + .tooltip-arrow::before { + border-top-color: $bg-purple-active; + } +} + +@keyframes animatedglow { + 0% { + opacity: 0.1; + } + 33% { + opacity: 0.7; + } + 100% { + opacity: 0.3; + } +} +.backgroundGlow { + filter: blur(125px); + grid-area: 1/1/1/1; + animation-name: animatedglow; + animation-duration: 1.75s; + opacity: 0.3; + background: linear-gradient( + 90deg, + rgba(80, 250, 219) 0.39%, + rgba(164, 42, 238, 0.8) 70% + ); +} + +.ds-table.table-hover { + tr.data-row:hover { + background-color: #151515af; + } +} + +// Backend logs debugger UI +.LogEvent { + code { + color: $text-muted; + } +} + +.parent-hover-trigger { + .child-hover-trigger { + visibility: hidden; + } + &:hover .child-hover-trigger { + visibility: visible; + } +} + +// Overwrite react-datepicker component +div.react-datepicker { + border-radius: 5px; + // border: 2px solid $text-muted; + border: 0; + // box-shadow: 0px 5px 7px -4px $dark; + // background-color: $bg-dark; + background-color: $body-bg; + + font-family: 'IBM Plex Mono', monospace; + font-size: 14px; + + // Calendar Month Header + .react-datepicker__header { + background-color: $bg-hdx-dark; + } + + // Calendar Month Header Text + .react-datepicker__current-month { + color: $text-light; + } + + // Calendar Day of the Week Header + .react-datepicker__day-name { + color: $text-muted; + } + + // Calendar Day + .react-datepicker__day, + .react-datepicker__time-name { + color: $text-light; + } + + // Selected Day + .react-datepicker__day--range-start, + .react-datepicker__day--keyboard-selected, + .react-datepicker__month-text--keyboard-selected, + .react-datepicker__quarter-text--keyboard-selected, + .react-datepicker__year-text--keyboard-selected { + background-color: $light !important; + color: $dark !important; + } + + // Hovered Day + .react-datepicker__day:hover, + .react-datepicker__month-text:hover, + .react-datepicker__quarter-text:hover, + .react-datepicker__year-text:hover { + box-shadow: inset 0px 0px 0px 1px $light; + background-color: transparent; + color: $text-light; + } + + // Inbetween Selected Date Range Dates + .react-datepicker__day--selected, + .react-datepicker__day--in-selecting-range, + .react-datepicker__day--in-range, + .react-datepicker__month-text--selected, + .react-datepicker__month-text--in-selecting-range, + .react-datepicker__month-text--in-range, + .react-datepicker__quarter-text--selected, + .react-datepicker__quarter-text--in-selecting-range, + .react-datepicker__quarter-text--in-range, + .react-datepicker__year-text--selected, + .react-datepicker__year-text--in-selecting-range, + .react-datepicker__year-text--in-range { + background-color: $bg-grey; + } + + .react-datepicker__day--today { + color: $green; + } + + // Disabled dates + .react-datepicker__day--disabled { + color: $text-muted; + &:hover { + color: $text-muted; + box-shadow: none; + } + } + + // Better center month navigation arrows + .react-datepicker__navigation-icon { + font-size: 12px; + } +} + +.ds-select { + &.input-bg .ds-react-select__control { + background: $input-bg; + } + + .ds-react-select__control { + // background: $bg-dark; + background: transparent; + border: 1px solid #212223; + // @apply bg-white dark:bg-neutral-700 border-2 border-neutral-300 dark:border-neutral-700 hover:border-neutral-400 dark:hover:border-neutral-500; + } + + .ds-react-select__control--is-focused { + // @apply border-neutral-500 hover:border-neutral-500 dark:border-neutral-400 dark:hover:border-neutral-400 shadow-none; + } + + .ds-react-select__menu { + background: $bg-hdx-dark; + border: 1px solid $text-muted; + // @apply bg-neutral-100 dark:bg-neutral-700 border-2 border-neutral-300 dark:border-neutral-600; + } + + .ds-react-select__option { + color: $text-light; + // background: $bg-dark; + // @apply text-neutral-600 dark:text-neutral-200 bg-neutral-100 hover:bg-neutral-200 dark:bg-neutral-700 dark:hover:bg-neutral-800; + } + .ds-react-select__option--is-focused { + background: $gray-900; + } + .ds-react-select__multi-value { + background: $gray-900; + + .ds-react-select__multi-value__label { + color: $text-light; + } + } + + .ds-react-select__indicator-separator { + width: 0; + } + .ds-react-select__indicator { + color: $text-muted; + } + + .ds-react-select__input-container, + .ds-react-select__placeholder, + .ds-react-select__single-value { + // @apply text-neutral-600 dark:text-neutral-200; + color: $text-muted; + // background: $bg-dark; + background: transparent; + } +} + +// React Grid for Dashboarding +.react-grid-item.react-grid-placeholder { + // Override the default placeholder color from red + background: $green !important; + opacity: 0.1 !important; +} +.react-grid-item > .react-resizable-handle::after { + border-color: rgba($green, 0.4) !important; + width: 7px; + height: 7px; +} + +// Nextra Overrides +.nextra-toc, +.nextra-sidebar-container { + font-family: 'Roboto', sans-serif; +} + +// custom overrides for jsontree +.react-json-tree { + & > ul { + width: 100%; + word-break: break-all; + } +} + +// recharts overrides +.recharts-default-legend { + text-align: left !important; +} +.recharts-legend-item { + font-size: 0.75rem; +} + +.white-text-gradient { + background: linear-gradient(180deg, #ffffff 0%, #c1c1c1 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; +} +// For the landing green->purple bg gradient card +.fancy-card-bg { + background: radial-gradient( + 79.84% 219.18% at 89.97% 87.4%, + rgba(80, 250, 219, 0.06) 0%, + rgba(164, 42, 238, 0.051) 100% + ) + /* warning: gradient uses a rotation that is not supported by CSS and may not behave as expected */, + linear-gradient( + 180deg, + rgba(255, 255, 255, 0.075) 0%, + rgba(255, 255, 255, 0.045) 100% + ); + border-radius: 4px; +} diff --git a/packages/app/styles/globals.css b/packages/app/styles/globals.css new file mode 100644 index 00000000..e5e2dcc2 --- /dev/null +++ b/packages/app/styles/globals.css @@ -0,0 +1,16 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json new file mode 100644 index 00000000..be1122bf --- /dev/null +++ b/packages/app/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "sourceMap": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "useUnknownInCatchVariables": false, + "jsx": "preserve", + "types": ["@types/intercom-web", "jest"] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/packages/miner/.gitignore b/packages/miner/.gitignore new file mode 100644 index 00000000..1ac265c1 --- /dev/null +++ b/packages/miner/.gitignore @@ -0,0 +1,52 @@ +*.bin + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +docs/_build/ diff --git a/packages/miner/Dockerfile b/packages/miner/Dockerfile new file mode 100644 index 00000000..f04563b9 --- /dev/null +++ b/packages/miner/Dockerfile @@ -0,0 +1,99 @@ +# Dockerfile +# Uses multi-stage builds requiring Docker 17.05 or higher +# See https://docs.docker.com/develop/develop-images/multistage-build/ + +# Creating a python base with shared environment variables +FROM python:3.11.3-slim AS python-base +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_HOME="/opt/poetry" \ + POETRY_VIRTUALENVS_IN_PROJECT=true \ + POETRY_NO_INTERACTION=1 \ + PYSETUP_PATH="/opt/pysetup" \ + VENV_PATH="/opt/pysetup/.venv" + +ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" + + +# builder-base is used to build dependencies +FROM python-base as builder-base +RUN apt-get update \ + && apt-get install --no-install-recommends -y \ + curl \ + build-essential +# Install Poetry - respects $POETRY_VERSION & $POETRY_HOME +ENV POETRY_VERSION=1.5.1 +RUN curl -sSL https://install.python-poetry.org | python - + +# We copy our Python requirements here to cache them +# and install only runtime deps using poetry +WORKDIR $PYSETUP_PATH +COPY ./packages/miner/poetry.lock ./packages/miner/pyproject.toml ./ +RUN poetry install --no-dev # respects + +# Reads through the list of packages installed in your active site-packages folder +# and installs the corresponding instrumentation libraries for these packages +RUN opentelemetry-bootstrap --action=install + +# 'development' stage installs all dev deps and can be used to develop code. +# For example using docker-compose to mount local volume under /app +FROM python-base as dev +ENV FASTAPI_ENV=development + +# Copying poetry and venv into image +COPY --from=builder-base $POETRY_HOME $POETRY_HOME +COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH + +# Copying in our entrypoint +COPY ./packages/miner/docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +# venv already has runtime deps installed we get a quicker install +WORKDIR $PYSETUP_PATH +RUN poetry install + + +WORKDIR /app + +EXPOSE 5123 +ENTRYPOINT /docker-entrypoint.sh $0 $@ +CMD ["opentelemetry-instrument", "uvicorn", "--reload", "--host=0.0.0.0", "--port=5123", "src.main:app"] + + +# 'lint' stage runs black and isort +# running in check mode means build will fail if any linting errors occur +# FROM development AS lint +# RUN black --config ./pyproject.toml --check app tests +# RUN isort --settings-path ./pyproject.toml --recursive --check-only +# CMD ["tail", "-f", "/dev/null"] + + +# 'test' stage runs our unit tests with pytest and +# coverage. Build will fail if test coverage is under 95% +# FROM development AS test +# RUN coverage run --rcfile ./pyproject.toml -m pytest ./tests +# RUN coverage report --fail-under 95 + + +# 'production' stage uses the clean 'python-base' stage and copyies +# in only our runtime deps that were installed in the 'builder-base' +FROM python-base as prod +ENV FASTAPI_ENV=production +ENV PORT=5123 + +EXPOSE 5123 + +COPY --from=builder-base $VENV_PATH $VENV_PATH +COPY ./packages/miner/gunicorn_conf.py /gunicorn_conf.py + +COPY ./packages/miner/docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +COPY ./packages/miner/src /app/src +WORKDIR /app + +ENTRYPOINT /docker-entrypoint.sh $0 $@ +CMD [ "gunicorn", "--worker-class uvicorn.workers.UvicornWorker", "--config /gunicorn_conf.py", "src.main:app"] diff --git a/packages/miner/docker-entrypoint.sh b/packages/miner/docker-entrypoint.sh new file mode 100644 index 00000000..e8e83d90 --- /dev/null +++ b/packages/miner/docker-entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +# activate our virtual environment here +. /opt/pysetup/.venv/bin/activate + +# You can put other setup logic here + +# Evaluating passed command: +exec "$@" diff --git a/packages/miner/gunicorn_conf.py b/packages/miner/gunicorn_conf.py new file mode 100644 index 00000000..beab33d9 --- /dev/null +++ b/packages/miner/gunicorn_conf.py @@ -0,0 +1,53 @@ +# From: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/315f04413114e938ff37a410b5979126facc90af/python3.7/gunicorn_conf.py + +import json +import multiprocessing +import os + +from hyperdx.opentelemetry import configure_opentelemetry + +workers_per_core_str = os.getenv("WORKERS_PER_CORE", "1") +web_concurrency_str = os.getenv("WEB_CONCURRENCY", None) +host = os.getenv("HOST", "0.0.0.0") +port = os.getenv("PORT", "5123") +bind_env = os.getenv("BIND", None) +use_loglevel = os.getenv("LOG_LEVEL", "info") +if bind_env: + use_bind = bind_env +else: + use_bind = f"{host}:{port}" + +cores = multiprocessing.cpu_count() +workers_per_core = float(workers_per_core_str) +default_web_concurrency = workers_per_core * cores +if web_concurrency_str: + web_concurrency = int(web_concurrency_str) + assert web_concurrency > 0 +else: + web_concurrency = max(int(default_web_concurrency), 2) + +# Gunicorn config variables +loglevel = use_loglevel +workers = web_concurrency +bind = use_bind +keepalive = 120 +timeout = 120 +errorlog = "-" + +# For debugging and testing +log_data = { + "loglevel": loglevel, + "workers": workers, + "bind": bind, + # Additional, non-gunicorn variables + "workers_per_core": workers_per_core, + "host": host, + "port": port, +} +print(json.dumps(log_data)) + + +def post_fork(server, worker): + server.log.info("Worker spawned (pid: %s)", worker.pid) + + configure_opentelemetry() diff --git a/packages/miner/poetry.lock b/packages/miner/poetry.lock new file mode 100644 index 00000000..28fe8491 --- /dev/null +++ b/packages/miner/poetry.lock @@ -0,0 +1,824 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, + {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "cachetools" +version = "4.2.1" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = "~=3.5" +files = [ + {file = "cachetools-4.2.1-py3-none-any.whl", hash = "sha256:1d9d5f567be80f7c07d765e21b814326d78c61eb0c3a637dffc0e5d1796cb2e2"}, + {file = "cachetools-4.2.1.tar.gz", hash = "sha256:f469e29e7aa4cff64d8de4aad95ce76de8ea1125a16c68e0d93f65c3c3dc92e9"}, +] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "drain3" +version = "0.9.11" +description = "Persistent & streaming log template miner" +optional = false +python-versions = "*" +files = [ + {file = "drain3-0.9.11.tar.gz", hash = "sha256:9ab4b1407fad74f56554ae371ef019c3c7985861631f4bab46a0e92585125f75"}, +] + +[package.dependencies] +cachetools = "4.2.1" +jsonpickle = "1.5.1" + +[package.extras] +kafka = ["kafka-python (==2.0.1)"] +redis = ["redis (==3.5.3)"] + +[[package]] +name = "fastapi" +version = "0.98.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.98.0-py3-none-any.whl", hash = "sha256:f4165fb1fe3610c52cb1b8282c1480de9c34bc270f56a965aa93a884c350d605"}, + {file = "fastapi-0.98.0.tar.gz", hash = "sha256:0d3c18886f652038262b5898fec6b09f4ca92ee23e9d9b1d1d24e429f84bf27b"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = ">=0.27.0,<0.28.0" + +[package.extras] +all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.59.1" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, + {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "grpcio" +version = "1.56.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.56.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:fb34ace11419f1ae321c36ccaa18d81cd3f20728cd191250be42949d6845bb2d"}, + {file = "grpcio-1.56.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:008767c0aed4899e657b50f2e0beacbabccab51359eba547f860e7c55f2be6ba"}, + {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:17f47aeb9be0da5337f9ff33ebb8795899021e6c0741ee68bd69774a7804ca86"}, + {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43c50d810cc26349b093bf2cfe86756ab3e9aba3e7e681d360930c1268e1399a"}, + {file = "grpcio-1.56.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187b8f71bad7d41eea15e0c9812aaa2b87adfb343895fffb704fb040ca731863"}, + {file = "grpcio-1.56.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:881575f240eb5db72ddca4dc5602898c29bc082e0d94599bf20588fb7d1ee6a0"}, + {file = "grpcio-1.56.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c243b158dd7585021d16c50498c4b2ec0a64a6119967440c5ff2d8c89e72330e"}, + {file = "grpcio-1.56.0-cp310-cp310-win32.whl", hash = "sha256:8b3b2c7b5feef90bc9a5fa1c7f97637e55ec3e76460c6d16c3013952ee479cd9"}, + {file = "grpcio-1.56.0-cp310-cp310-win_amd64.whl", hash = "sha256:03a80451530fd3b8b155e0c4480434f6be669daf7ecba56f73ef98f94222ee01"}, + {file = "grpcio-1.56.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:64bd3abcf9fb4a9fa4ede8d0d34686314a7075f62a1502217b227991d9ca4245"}, + {file = "grpcio-1.56.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:fdc3a895791af4addbb826808d4c9c35917c59bb5c430d729f44224e51c92d61"}, + {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:4f84a6fd4482e5fe73b297d4874b62a535bc75dc6aec8e9fe0dc88106cd40397"}, + {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14e70b4dda3183abea94c72d41d5930c333b21f8561c1904a372d80370592ef3"}, + {file = "grpcio-1.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b5ce42a5ebe3e04796246ba50357f1813c44a6efe17a37f8dc7a5c470377312"}, + {file = "grpcio-1.56.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8219f17baf069fe8e42bd8ca0b312b875595e43a70cabf397be4fda488e2f27d"}, + {file = "grpcio-1.56.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:defdd14b518e6e468466f799aaa69db0355bca8d3a5ea75fb912d28ba6f8af31"}, + {file = "grpcio-1.56.0-cp311-cp311-win32.whl", hash = "sha256:50f4daa698835accbbcc60e61e0bc29636c0156ddcafb3891c987e533a0031ba"}, + {file = "grpcio-1.56.0-cp311-cp311-win_amd64.whl", hash = "sha256:59c4e606993a47146fbeaf304b9e78c447f5b9ee5641cae013028c4cca784617"}, + {file = "grpcio-1.56.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b1f4b6f25a87d80b28dd6d02e87d63fe1577fe6d04a60a17454e3f8077a38279"}, + {file = "grpcio-1.56.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c2148170e01d464d41011a878088444c13413264418b557f0bdcd1bf1b674a0e"}, + {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:0409de787ebbf08c9d2bca2bcc7762c1efe72eada164af78b50567a8dfc7253c"}, + {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66f0369d27f4c105cd21059d635860bb2ea81bd593061c45fb64875103f40e4a"}, + {file = "grpcio-1.56.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38fdf5bd0a1c754ce6bf9311a3c2c7ebe56e88b8763593316b69e0e9a56af1de"}, + {file = "grpcio-1.56.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:79d4c5911d12a7aa671e5eb40cbb50a830396525014d2d6f254ea2ba180ce637"}, + {file = "grpcio-1.56.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5d2fc471668a7222e213f86ef76933b18cdda6a51ea1322034478df8c6519959"}, + {file = "grpcio-1.56.0-cp37-cp37m-win_amd64.whl", hash = "sha256:991224fd485e088d3cb5e34366053691a4848a6b7112b8f5625a411305c26691"}, + {file = "grpcio-1.56.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c6f36621aabecbaff3e70c4d1d924c76c8e6a7ffec60c331893640a4af0a8037"}, + {file = "grpcio-1.56.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:1eadd6de258901929223f422ffed7f8b310c0323324caf59227f9899ea1b1674"}, + {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:72836b5a1d4f508ffbcfe35033d027859cc737972f9dddbe33fb75d687421e2e"}, + {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f92a99ab0c7772fb6859bf2e4f44ad30088d18f7c67b83205297bfb229e0d2cf"}, + {file = "grpcio-1.56.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa08affbf672d051cd3da62303901aeb7042a2c188c03b2c2a2d346fc5e81c14"}, + {file = "grpcio-1.56.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2db108b4c8e29c145e95b0226973a66d73ae3e3e7fae00329294af4e27f1c42"}, + {file = "grpcio-1.56.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8674fdbd28266d8efbcddacf4ec3643f76fe6376f73283fd63a8374c14b0ef7c"}, + {file = "grpcio-1.56.0-cp38-cp38-win32.whl", hash = "sha256:bd55f743e654fb050c665968d7ec2c33f03578a4bbb163cfce38024775ff54cc"}, + {file = "grpcio-1.56.0-cp38-cp38-win_amd64.whl", hash = "sha256:c63bc5ac6c7e646c296fed9139097ae0f0e63f36f0864d7ce431cce61fe0118a"}, + {file = "grpcio-1.56.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c0bc9dda550785d23f4f025be614b7faa8d0293e10811f0f8536cf50435b7a30"}, + {file = "grpcio-1.56.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d596408bab632ec7b947761e83ce6b3e7632e26b76d64c239ba66b554b7ee286"}, + {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76b6e6e1ee9bda32e6e933efd61c512e9a9f377d7c580977f090d1a9c78cca44"}, + {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7beb84ebd0a3f732625124b73969d12b7350c5d9d64ddf81ae739bbc63d5b1ed"}, + {file = "grpcio-1.56.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83ec714bbbe9b9502177c842417fde39f7a267031e01fa3cd83f1ca49688f537"}, + {file = "grpcio-1.56.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4feee75565d1b5ab09cb3a5da672b84ca7f6dd80ee07a50f5537207a9af543a4"}, + {file = "grpcio-1.56.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b4638a796778329cc8e142e4f57c705adb286b3ba64e00b0fa91eeb919611be8"}, + {file = "grpcio-1.56.0-cp39-cp39-win32.whl", hash = "sha256:437af5a7673bca89c4bc0a993382200592d104dd7bf55eddcd141cef91f40bab"}, + {file = "grpcio-1.56.0-cp39-cp39-win_amd64.whl", hash = "sha256:4241a1c2c76e748023c834995cd916570e7180ee478969c2d79a60ce007bc837"}, + {file = "grpcio-1.56.0.tar.gz", hash = "sha256:4c08ee21b3d10315b8dc26f6c13917b20ed574cdbed2d2d80c53d5508fdcc0f2"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.56.0)"] + +[[package]] +name = "gunicorn" +version = "20.1.0" +description = "WSGI HTTP Server for UNIX" +optional = false +python-versions = ">=3.5" +files = [ + {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, + {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, +] + +[package.dependencies] +setuptools = ">=3.0" + +[package.extras] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +tornado = ["tornado (>=0.2)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "hyperdx-opentelemetry" +version = "0.0.4" +description = "HyperDX OpenTelemetry Distro for Python" +optional = false +python-versions = ">=3.7.2,<4.0" +files = [ + {file = "hyperdx_opentelemetry-0.0.4-py3-none-any.whl", hash = "sha256:49f72a0f743ff9e271a78d40d7931edf804d63c8691c14ec7f5cacc2f4a5b665"}, + {file = "hyperdx_opentelemetry-0.0.4.tar.gz", hash = "sha256:a26f98a363c177cf3a57d1011147a15b85fd2e3cb26787a083a247b6ab88d63e"}, +] + +[package.dependencies] +opentelemetry-api = "1.18.0" +opentelemetry-exporter-otlp = "1.18.0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-sdk = "1.18.0" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.0.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.0.1-py3-none-any.whl", hash = "sha256:1543daade821c89b1c4a55986c326f36e54f2e6ca3bad96be4563d0acb74dcd4"}, + {file = "importlib_metadata-6.0.1.tar.gz", hash = "sha256:950127d57e35a806d520817d3e92eec3f19fdae9f0cd99da77a407c5aabefba3"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "jsonpickle" +version = "1.5.1" +description = "Python library for serializing any arbitrary object graph into JSON" +optional = false +python-versions = ">=2.7" +files = [ + {file = "jsonpickle-1.5.1-py2.py3-none-any.whl", hash = "sha256:8eb8323f0e12cb40687f0445e2115d8165901e20ac670add55bb53a95c68c0e5"}, + {file = "jsonpickle-1.5.1.tar.gz", hash = "sha256:060f97096559d1b86aa16cac2f4ea5f7b6da0c15d8a4de150b78013a886f9a51"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=3.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["coverage (<5)", "ecdsa", "enum34", "feedparser", "jsonlib", "numpy", "pandas", "pymongo", "pytest (>=3.5,!=3.7.3)", "pytest-black-multipy", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-flake8", "sklearn", "sqlalchemy"] +testing-libs = ["demjson", "simplejson", "ujson", "yajl"] + +[[package]] +name = "opentelemetry-api" +version = "1.18.0" +description = "OpenTelemetry Python API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_api-1.18.0-py3-none-any.whl", hash = "sha256:d05bcc94ec239fd76fd90d784c5e3ad081a8a1ac2ffc8a2c83a49ace052d1492"}, + {file = "opentelemetry_api-1.18.0.tar.gz", hash = "sha256:2bbf29739fcef268c419e3bf1735566c2e7f81026c14bcc78b62a0b97f8ecf2f"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0.0,<6.1.0" +setuptools = ">=16.0" + +[[package]] +name = "opentelemetry-exporter-otlp" +version = "1.18.0" +description = "OpenTelemetry Collector Exporters" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp-1.18.0-py3-none-any.whl", hash = "sha256:2b8d18aa3f8fa360df2fe6c274132cf38939a02f8aa621d6ed060a920aa9e4c6"}, + {file = "opentelemetry_exporter_otlp-1.18.0.tar.gz", hash = "sha256:cafcf7f28debbcc22e06d52cdc4f65a118f17b730dabe8f9d4b87587e95b1481"}, +] + +[package.dependencies] +opentelemetry-exporter-otlp-proto-grpc = "1.18.0" +opentelemetry-exporter-otlp-proto-http = "1.18.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.18.0" +description = "OpenTelemetry Protobuf encoding" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.18.0-py3-none-any.whl", hash = "sha256:276073ccc8c6e6570fe05ca8ca0de77d662bc89bc614ec8bfbc855112f7e25e3"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.18.0.tar.gz", hash = "sha256:4d9883d6929aabe75e485950bbe8b149a14d95e50b1570426832daa6913b0871"}, +] + +[package.dependencies] +opentelemetry-proto = "1.18.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.18.0" +description = "OpenTelemetry Collector Protobuf over gRPC Exporter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp_proto_grpc-1.18.0-py3-none-any.whl", hash = "sha256:c773bc9df2c9d6464f0d5936963399b2fc440f0616c1277f29512d540ad7e0a2"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.18.0.tar.gz", hash = "sha256:8eddfde4267da876871e62f1b58369986bdb7e47e43032c498f1ea807d7191c4"}, +] + +[package.dependencies] +backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +grpcio = ">=1.0.0,<2.0.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.18.0" +opentelemetry-proto = "1.18.0" +opentelemetry-sdk = ">=1.18.0,<1.19.0" + +[package.extras] +test = ["pytest-grpc"] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.18.0" +description = "OpenTelemetry Collector Protobuf over HTTP Exporter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp_proto_http-1.18.0-py3-none-any.whl", hash = "sha256:c22110705473f1c61bd4d74ded3b8bd3fac66ffbe7d9ba376267d8539919ed90"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.18.0.tar.gz", hash = "sha256:d9a2118558decf9e9a2d6573ad9d33876f3a44d7dc43f10d38a900d5a6f867d6"}, +] + +[package.dependencies] +backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.18.0" +opentelemetry-proto = "1.18.0" +opentelemetry-sdk = ">=1.18.0,<1.19.0" +requests = ">=2.7,<3.0" + +[package.extras] +test = ["responses (==0.22.0)"] + +[[package]] +name = "opentelemetry-instrumentation" +version = "0.39b0" +description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_instrumentation-0.39b0-py3-none-any.whl", hash = "sha256:fcfd74413159fe797e343104f7e85a3f8146713634debcac10a057ac7f1eb011"}, + {file = "opentelemetry_instrumentation-0.39b0.tar.gz", hash = "sha256:2a6d1f386aa769dc763e6f2c6b483f50c4024f1bc76a78b57f05ae05970ce5f4"}, +] + +[package.dependencies] +opentelemetry-api = ">=1.4,<2.0" +setuptools = ">=16.0" +wrapt = ">=1.0.0,<2.0.0" + +[[package]] +name = "opentelemetry-proto" +version = "1.18.0" +description = "OpenTelemetry Python Proto" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_proto-1.18.0-py3-none-any.whl", hash = "sha256:34d1c49283f0246a58761d9322d5a79702a09afda0bb181bb6378ed26862e446"}, + {file = "opentelemetry_proto-1.18.0.tar.gz", hash = "sha256:4f38d01049c3926b9fd09833574bfb5e172d84c8ca85e2ab7f4b5a198d75aeef"}, +] + +[package.dependencies] +protobuf = ">=3.19,<5.0" + +[[package]] +name = "opentelemetry-sdk" +version = "1.18.0" +description = "OpenTelemetry Python SDK" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_sdk-1.18.0-py3-none-any.whl", hash = "sha256:a097cc1e0db6ff33b4d250a9350dc17975d24a22aa667fca2866e60c51306723"}, + {file = "opentelemetry_sdk-1.18.0.tar.gz", hash = "sha256:cd3230930a2ab288b1df149d261e9cd2bd48dee54ad18465a777831cb6779e90"}, +] + +[package.dependencies] +opentelemetry-api = "1.18.0" +opentelemetry-semantic-conventions = "0.39b0" +setuptools = ">=16.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.39b0" +description = "OpenTelemetry Semantic Conventions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_semantic_conventions-0.39b0-py3-none-any.whl", hash = "sha256:0dd7a9dc0dfde2335f643705bba8f7c44182c797bc208b7601f0b8e8211cfd5c"}, + {file = "opentelemetry_semantic_conventions-0.39b0.tar.gz", hash = "sha256:06a9f198574e0dab6ebc072b59d89092cf9f115638a8a02157586769b6b7a69a"}, +] + +[[package]] +name = "protobuf" +version = "4.23.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, +] + +[[package]] +name = "pydantic" +version = "1.10.9" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"}, + {file = "pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"}, + {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"}, + {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"}, + {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"}, + {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"}, + {file = "pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"}, + {file = "pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"}, + {file = "pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"}, + {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"}, + {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"}, + {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"}, + {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"}, + {file = "pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"}, + {file = "pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"}, + {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"}, + {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"}, + {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"}, + {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"}, + {file = "pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"}, + {file = "pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"}, + {file = "pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"}, + {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"}, + {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"}, + {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"}, + {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"}, + {file = "pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"}, + {file = "pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"}, + {file = "pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"}, + {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"}, + {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"}, + {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"}, + {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"}, + {file = "pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"}, + {file = "pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"}, + {file = "pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.6.3" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.22.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "zipp" +version = "3.16.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.16.1-py3-none-any.whl", hash = "sha256:0b37c326d826d5ca35f2b9685cd750292740774ef16190008b00a0227c256fe0"}, + {file = "zipp-3.16.1.tar.gz", hash = "sha256:857b158da2cbf427b376da1c24fd11faecbac5a4ac7523c3607f8a01f94c2ec0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "57f5a8a3af6298eba7d85ef9374d4fa9393ed749075e7ca503f8777ea325aaed" diff --git a/packages/miner/pyproject.toml b/packages/miner/pyproject.toml new file mode 100644 index 00000000..af334540 --- /dev/null +++ b/packages/miner/pyproject.toml @@ -0,0 +1,19 @@ +[tool.poetry] +name = "miner" +version = "0.1.0" +description = "" +authors = ["Mike Shi "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +drain3 = "^0.9.11" +fastapi = "^0.98.0" +gunicorn = "^20.1.0" +uvicorn = "^0.22.0" +hyperdx-opentelemetry = "0.0.4" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/packages/miner/src/__init__.py b/packages/miner/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/packages/miner/src/main.py b/packages/miner/src/main.py new file mode 100644 index 00000000..04933e40 --- /dev/null +++ b/packages/miner/src/main.py @@ -0,0 +1,109 @@ +from typing import List +import hashlib +import json +import logging +import time + +from drain3 import TemplateMiner +from drain3.file_persistence import FilePersistence +from drain3.masking import MaskingInstruction +from drain3.template_miner_config import TemplateMinerConfig +from fastapi import FastAPI, Request +from pydantic import BaseModel + + +API_VERSION = "0.0.1" + +app = FastAPI() + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + + +def get_template_miner(): + persistence = FilePersistence("hdx_state.bin") + config = TemplateMinerConfig() + # config.load(dirname(__file__) + "/drain3.ini") + config.profiling_enabled = True + config.masking_instructions = [ + MaskingInstruction( + "((?<=[^A-Za-z0-9])|^)([\\-\\+]?\\d+)((?=[^A-Za-z0-9])|$)", "NUM" + ), + MaskingInstruction( + "((?<=[^A-Za-z0-9])|^)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})((?=[^A-Za-z0-9])|$)", + "IP", + ), + ] + + template_miner = TemplateMiner(persistence, config=config) + + return template_miner + + +def sha1_hash(string): + sha1 = hashlib.sha1() + sha1.update(string.encode("utf-8")) + hashed_string = sha1.hexdigest() + return hashed_string + + +class LogData(BaseModel): + lines: List[List[str]] + + +class LogPattern(BaseModel): + change_type: str + cluster_count: int + cluster_id: str + cluster_size: int + template_mined: str + + +# write me a flask endpoint that accepts a log message in the body of the request as JSON +# and returns the result of calling template_miner.add_log_message on that message +# as JSON in the response body +@app.post("/logs") +def post_log(log_data: LogData): + logger.warning( + json.dumps( + { + "message": "Processing logs", + "lines": len(log_data.lines), + } + ) + ) + t1 = time.time() + template_miner = get_template_miner() + result = {} + patterns = {} + for line in log_data.lines: + [log_id, log_body] = line + pattern = template_miner.add_log_message(log_body) + pattern_id = str(pattern["cluster_id"]) + patterns[pattern_id] = pattern["template_mined"] + result[log_id] = pattern_id + # if pattern['change_type'] == 'cluster_template_changed' or pattern['change_type'] == 'none': + # result[log_id] = pattern['template_mined'] + logger.warning( + json.dumps( + { + "message": "Processed logs", + "patterns": len(patterns), + "lines": len(log_data.lines), + "duration_ms": (time.time() - t1) * 1000, + "duration_per_log_ms": ((time.time() - t1) / len(log_data.lines)) + * 1000, + } + ) + ) + return { + "patterns": patterns, + "result": result, + } + + +@app.get("/health") +def health_check(): + logger.info("🐱 Health check !!!!") + + return {"status": "ok", "version": API_VERSION} diff --git a/packages/miner/tests/__init__.py b/packages/miner/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..ccb61e8d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,15507 @@ +# 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.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@aws-crypto/ie11-detection@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" + integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" + integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" + integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" + integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/abort-controller@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz#c2d244e9d422583a786dfb75485316cb1d4793ce" + integrity sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/client-cognito-identity@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.279.0.tgz#c7fc1e920d8466e65934f2d272396185e2ab4d1d" + integrity sha512-MQQdgc3CGDumKutKWlNcDFgNXe2/Tr9TqDGh1EbtXODdxrsT/xQPMghlGCsrTxnPk16zj6OIlS/4h9bTbk6CVg== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.279.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.279.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.278.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.279.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.279.0" + "@aws-sdk/util-defaults-mode-node" "3.279.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/client-sso-oidc@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.279.0.tgz#358c67172d066968f4439884cdf40299b6822c4e" + integrity sha512-tC9xKGo3z/HQbJDMvaUrnBSSRX7sOX2YUA2OpJ3T1TTfylLTO70OKjg1G4OMFNiPpJsHonwD7Iud+rnMnUKI0g== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.278.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.279.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.279.0" + "@aws-sdk/util-defaults-mode-node" "3.279.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/client-sso@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.279.0.tgz#92c7a8af6859093e7adbf87add9aa3e4a155aa39" + integrity sha512-599Y5wOrkpjD6p0BTs0X4+Ge9O7jlAPJ2ttI9lfhT2/UEZyqoJHajJs1pMJV75oeZklPOBi8G9jnZcMVJgRpvQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.278.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.279.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.279.0" + "@aws-sdk/util-defaults-mode-node" "3.279.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/client-sts@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.279.0.tgz#87b0a75f47e2b0a20624cc88f5c117546331571e" + integrity sha512-y/cI5Gg5WWqmSSDQftCT26wOLu0HSuPY1u6Q4Q97FBIfRC3hYztjYdUDHuTu6qPPT+tdsnWOUy2tr3qamVSQ4g== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.279.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.278.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-sdk-sts" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.279.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.279.0" + "@aws-sdk/util-defaults-mode-node" "3.279.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + fast-xml-parser "4.1.2" + tslib "^2.3.1" + +"@aws-sdk/config-resolver@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz#207af3c70b05c4d93c60fa60201c93dff78802ba" + integrity sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw== + dependencies: + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-cognito-identity@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.279.0.tgz#941876f7ca56d72eebb051ee51c52e52fada4e2e" + integrity sha512-RhpKmIM1RfrmbtTXiDK3qyx9aJcZlvHpP18Axbjokld7R6YEdMpv8piB8v19kd6zl0e9xPNrX9At6UOFsXpeJw== + dependencies: + "@aws-sdk/client-cognito-identity" "3.279.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-env@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz#c647799806d2cf491b9b0d8d32682393caf74e20" + integrity sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-imds@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz#8e740961c2e1f9b93a467e8d5e836e359e18592c" + integrity sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ== + dependencies: + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-ini@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.279.0.tgz#22e477be3b9642a7509aad64d69bd7624cdfafd1" + integrity sha512-FCpr3/khMTb2pWLMC138wU7HzcpkrjejrBNfCJSUu7Emxm039UMLjT2JObnRKxidKlz58oYBRayVIbBYRWREcg== + dependencies: + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.279.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-node@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.279.0.tgz#46e6d477f2a94878f3635598a371d34df6e6ace3" + integrity sha512-7D8ETopCt3H+x2BEPMEhzc4dcNtSK7umnRdgfiTGRjcQSVPh5Whq/tDIAtNj2D+PmLgu3e+Hk7jrXkaMCDlxMw== + dependencies: + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-ini" "3.279.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.279.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-process@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz#bd0c859554e705c085f0e2ad5dad7e1e43c967ad" + integrity sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-sso@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.279.0.tgz#e0eb3928a86c3978f77dd218ed84c306ebdfb44c" + integrity sha512-u8ZHz9Sv7sAv2vllyzcdgcO1pC5pa2UuoYKfz9J8hqLHc8VJYtYQ6WJvi4GoA55VDPk87pyVYz9t6ATntsukaw== + dependencies: + "@aws-sdk/client-sso" "3.279.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/token-providers" "3.279.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-web-identity@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz#2a1d8f73654c2d50bf27c6355a550bc389d6057e" + integrity sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-providers@^3.186.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.279.0.tgz#1c703e7638eabe4ccda071badbcdc48e14c0d601" + integrity sha512-iZI7hrP7oEP2zzStuiEWklVQY3HqIX02PxQiGMgW9/6Bb+2xBpZykIkBBmqaOKlNF/us1TJS6WDOylL1Z1EcIw== + dependencies: + "@aws-sdk/client-cognito-identity" "3.279.0" + "@aws-sdk/client-sso" "3.279.0" + "@aws-sdk/client-sts" "3.279.0" + "@aws-sdk/credential-provider-cognito-identity" "3.279.0" + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-ini" "3.279.0" + "@aws-sdk/credential-provider-node" "3.279.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.279.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/fetch-http-handler@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz#52ec2ba4ea25738a91db466a617bd7cc2bd6d2e9" + integrity sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/querystring-builder" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/hash-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz#a39d80fd118ad306f17191f0565ea4db88aa0563" + integrity sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng== + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-buffer-from" "3.208.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/invalid-dependency@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz#93b34dc0f78d0c44a4beae6dc75dde4801915f1c" + integrity sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/is-array-buffer@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz#06e557adc284fac2f26071c2944ae01f61b95854" + integrity sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/middleware-content-length@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz#400532904c505d3478ddf5c8fe1d703692ea87e8" + integrity sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-endpoint@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz#3d10dff07eeb6239b39b2e2762b11d97f19e4a56" + integrity sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg== + dependencies: + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-host-header@3.278.0": + version "3.278.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.278.0.tgz#d941a952d3f26453a4fff5939951e4bf99d7ce65" + integrity sha512-oTkF3exy89KE8NgSeXFwD+0H0GRKL2qUw92t3caEj7+4KzU/0m3t7NtKlq2NLRtTJhZ/izYRpV536oogLzGm3g== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-logger@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz#372e2514b17b826a2b40562667e2543125980705" + integrity sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-recursion-detection@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz#1e6ddc66a11fa2bfd2a59607d2ac5603be6d1072" + integrity sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-retry@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz#a38adcb9eb478246de3f3398bb8fd0a7682462eb" + integrity sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/service-error-classification" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + tslib "^2.3.1" + uuid "^8.3.2" + +"@aws-sdk/middleware-sdk-sts@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz#aa437331f958e3af3b4bec7951256d0f34a8d431" + integrity sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q== + dependencies: + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-serde@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz#9cb23aaa93fbf404fdb8e01b514b36b2d6fb5bc8" + integrity sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-signing@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz#ce632b547d5a091b4bda9d65cb4745445ab5d237" + integrity sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-middleware" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-stack@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz#e62048e47b8ce2ff71d6d32234b6c0be70b0b008" + integrity sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/middleware-user-agent@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz#ea49970c9dbbe4e8fce21763e2ff0d7acab057c2" + integrity sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/node-config-provider@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz#7797a8f500593b1a7b91fc70bcd7a7245afd9a61" + integrity sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/node-http-handler@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz#732c7010310da292d4a6c30f915078e1792d029e" + integrity sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA== + dependencies: + "@aws-sdk/abort-controller" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/querystring-builder" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/property-provider@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz#a626604303acfe83c1a1471f99872dee5641c1a4" + integrity sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/protocol-http@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz#11090fed5d1e20f9f8e97b479e1d6fb2247686f6" + integrity sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/querystring-builder@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz#788ca037e21942bb039c920c5dfa4d412b84ea27" + integrity sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw== + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/querystring-parser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz#68db5798d10a353c35f62bf34cfcebaa53580e51" + integrity sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/service-error-classification@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz#cf19b82c2ab1e63bb03793c68e6a2b2e7cbd8382" + integrity sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w== + +"@aws-sdk/shared-ini-file-loader@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz#f924ec6e7c183ec749d42e204d8f0d0b7c58fa25" + integrity sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/signature-v4@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz#751895d68c1d1122f1e9a0148146dbdf9db023ae" + integrity sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/smithy-client@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.279.0.tgz#a3d90b7fb8e335cb8da46b70133c3db0d4ada8c5" + integrity sha512-ZcYWUQDGAYN6NXRpJuSn46PetrpPCA6TrDVwP9+3pERzTXZ66npXoG2XhHjNrOXy/Ted5A3OxKrM4/zLu9tK3A== + dependencies: + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/token-providers@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.279.0.tgz#721194bc67100dbf8b563857bf71900de6735261" + integrity sha512-bsUlZSizTXZ8Pehdatcioi8VphxYn7fRjo5L083peOvBjoL+9WSGyP74PLrFLNwA35QxddwOqgnpQZoE1heuPQ== + dependencies: + "@aws-sdk/client-sso-oidc" "3.279.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/types@3.272.0", "@aws-sdk/types@^3.222.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.272.0.tgz#83670e4009c2e72f1fdf55816c55c9f8b5935e0a" + integrity sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/url-parser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz#1a21abb8815ccc2c1344a3dfab0343f4e3eff4d3" + integrity sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ== + dependencies: + "@aws-sdk/querystring-parser" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-base64@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz#36b430e5396251f761590f7c2f0c5c12193f353c" + integrity sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/util-body-length-browser@3.188.0": + version "3.188.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz#e1d949318c10a621b38575a9ef01e39f9857ddb0" + integrity sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-body-length-node@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz#baabd1fa1206ff2bd4ce3785122d86eb3258dd20" + integrity sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-buffer-from@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz#285e86f6dc9030148a4147d65239e75cb254a1b0" + integrity sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/util-config-provider@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz#c485fd83fbac051337e5f6be60ea3f9fa61c0139" + integrity sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-defaults-mode-browser@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.279.0.tgz#8d16977f0162e272b2d77d67c4588a6374e8bd6e" + integrity sha512-RnchYRrpapTT5Hu23LOfk6e8RMVq0kUzho6xA6TJj1a4uGxkcRMvgzPipCq1P5uHu0mrkQBg9pGPEVNOUs38/Q== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + bowser "^2.11.0" + tslib "^2.3.1" + +"@aws-sdk/util-defaults-mode-node@3.279.0": + version "3.279.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.279.0.tgz#e05c043898e937282c45c1b3bcefab10e569783e" + integrity sha512-A2NB10xReWC+GSnOivKGZ9rnljIZdEP8WMCQQEnA6DJNI19AUFF/O9QJ9y+cHGLKEms7jH86Y99wShdpzAK+Jw== + dependencies: + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-endpoints@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz#4e4c849708634c3dd840a11abaacb02c89db46d3" + integrity sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-hex-encoding@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d" + integrity sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz#0f598fc238a1256e4bcb64d01459f03a922dd4c3" + integrity sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-middleware@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz#ed7d732a34659b07f949e2de39cde66271a3c632" + integrity sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-retry@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz#049f777d4a8f9fd7b7ed02e116d3a23ceb34f128" + integrity sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg== + dependencies: + "@aws-sdk/service-error-classification" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-uri-escape@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz#5e708d4cde001a4558ee616f889ceacfadd2ab03" + integrity sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-browser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz#9ff8834d38b2178d72cc5c63ba3e089cc1b9a9ae" + integrity sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA== + dependencies: + "@aws-sdk/types" "3.272.0" + bowser "^2.11.0" + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz#8e8c85d8c3ac4471a309589d91094be14a4260df" + integrity sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA== + dependencies: + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-utf8@3.254.0": + version "3.254.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz#909af9c6549833a9a9bf77004b7484bfc96b2c35" + integrity sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.19.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@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.19.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + 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.21.0", "@babel/parser@^7.21.2", "@babel/parser@^7.4.3": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@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-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.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.21.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@~7.18.3": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.20.7", "@babel/template@^7.3.3", "@babel/template@^7.4.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + 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== + +"@clickhouse/client@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-0.1.1.tgz#1a848438baf5deefadf7dcee40ad441c8666c398" + integrity sha512-oeALCAjNFEXHPxMHJgj0QERiLM2ZknOOavvHB1mxmztZLhTuj86HaQEfh9q8x7LgKnv3jep7lb/fhFgD71WTjA== + dependencies: + uuid "^9.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@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" + +"@deploysentinel/debugger-core@^0.3.5": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@deploysentinel/debugger-core/-/debugger-core-0.3.6.tgz#21b74fcd4466e3fa8ed9b6f8a1188b96d382fac0" + integrity sha512-msK0FIJk3QrL/5GdTwoxNcWcxT9QlOhmHq+PnWQvf5qpWpnkMgiUJ/71eVJwM1Y0m/fV5JIUjmGOAe+8G636Jg== + dependencies: + axios "^0.27.2" + axios-retry "^3.3.1" + bluebird "^3.7.2" + check-more-types "2.24.0" + compare-versions "^5.0.1" + date-fns "^2.29.3" + debug "^4.3.4" + execa "1.0.0" + fast-safe-stringify "^2.1.1" + fflate "^0.7.4" + lazy-ass "1.6.0" + lodash "^4.17.21" + ramda "0.26.1" + +"@deploysentinel/jest-rtl-debugger@^0.2.3": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@deploysentinel/jest-rtl-debugger/-/jest-rtl-debugger-0.2.5.tgz#e83509abb44af690b5afc9b9e107e03fc6b52222" + integrity sha512-rve17mkmX3HV0baJK2fYnjVYufR2lwDIjDKXcjCMjkd/zzsFjx9C1AJ/Dutdtc1Ui+29ethwnCRieOuO2dBm6Q== + dependencies: + "@deploysentinel/debugger-core" "^0.3.5" + "@svgr/core" "^6.2.1" + camelcase "^6.3.0" + dotenv "^16.0.2" + jest-environment-jsdom24 "npm:jest-environment-jsdom@^24.9.0" + jest-environment-jsdom25 "npm:jest-environment-jsdom@^25.5.0" + jest-environment-jsdom26 "npm:jest-environment-jsdom@^26.6.2" + jest-environment-jsdom27 "npm:jest-environment-jsdom@^27.5.1" + jest-environment-jsdom28 "npm:jest-environment-jsdom@^28.1.3" + jest-environment-jsdom29 "npm:jest-environment-jsdom@^29.0.1" + lodash "^4.17.21" + slash "^3.0.0" + +"@emotion/babel-plugin@^11.10.6": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" + integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.3" + +"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.8.1": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + +"@eslint-community/eslint-utils@^4.2.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.6.1": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.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/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + 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.48.0": + version "8.48.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== + +"@floating-ui/core@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.3.tgz#327a2c11e6570b7d64368ad74a3ac12786c9f751" + integrity sha512-upVRtrNZuYNsw+EoxkiBFRPROnU8UTy/u/dZ9U0W14BlemPYODwhhxYXSR2Y9xOnvr1XtptJRWx7gL8Te1qaog== + +"@floating-ui/dom@^1.0.1": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.4.tgz#e2eb2674f57fc182c425587e48ea43e336f4b8f8" + integrity sha512-4+k+BLhtWj+peCU60gp0+rHeR8+Ohqx6kjJf/lHMnJ8JD5Qj6jytcq1+SZzRwD7rvHKRhR7TDiWWddrNrfwQLg== + dependencies: + "@floating-ui/core" "^1.2.3" + +"@grpc/grpc-js@^1.7.1": + version "1.8.14" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.14.tgz#4fe0f9917d6f094cf59245763c275442b182e9ad" + integrity sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.7.0": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.7.tgz#d33677a77eea8407f7c66e2abd97589b60eb4b21" + integrity sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.0.0" + yargs "^17.7.2" + +"@hapi/b64@5.x.x": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" + integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x", "@hapi/boom@^9.0.0": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/bourne@2.x.x": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" + integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== + +"@hapi/cryptiles@5.x.x": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" + integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== + dependencies: + "@hapi/boom" "9.x.x" + +"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/iron@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" + integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== + dependencies: + "@hapi/b64" "5.x.x" + "@hapi/boom" "9.x.x" + "@hapi/bourne" "2.x.x" + "@hapi/cryptiles" "5.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/podium@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" + integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== + dependencies: + "@hapi/hoek" "9.x.x" + "@hapi/teamwork" "5.x.x" + "@hapi/validate" "1.x.x" + +"@hapi/teamwork@5.x.x": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" + integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@hapi/validate@1.x.x": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" + integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + +"@headlessui/react@^1.6.6": + version "1.7.13" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.13.tgz#fd150b394954e9f1d86ed2340cffd1217d6e7628" + integrity sha512-9n+EQKRtD9266xIHXdY5MfiXPDfYwl7zBM7KOx2Ae3Gdgxy8QML1FkCMjq6AsOf0l6N9uvI4HcFtuFlenaldKg== + dependencies: + client-only "^0.0.1" + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + 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== + +"@hyperdx/browser@^0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@hyperdx/browser/-/browser-0.18.3.tgz#dbf8ca52f89f79e32782efa14042aea4f7139d7b" + integrity sha512-EH1MB0moVyk8jFSyycROsSlrG1CZTt0Wz3yTjwQQym5EjdJTqAB/hk+p5JaFe0H8CxAvOUln9GrtiueFiy6X0Q== + dependencies: + "@hyperdx/otel-web" "0.16.2-11" + "@hyperdx/otel-web-session-recorder" "0.16.2-11" + "@sentry/browser" "^7.64.0" + +"@hyperdx/lucene@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@hyperdx/lucene/-/lucene-3.1.1.tgz#b860fc26547628de1185e175a47d7909d3d77f37" + integrity sha512-Kx3WgUI1FUeHOQB0nPtijc7L2Po9QaKTMSj4P1B3Qt6UNHJuJ0x04G+BfNYeCBy6c0LSkOlsyhFtzwXVkSIv6Q== + +"@hyperdx/node-logger@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@hyperdx/node-logger/-/node-logger-0.2.7.tgz#482280a0ceed308269b7a7844f364b201a27f0f0" + integrity sha512-75t775MnWgC79mZcnCUPzqrKQxFed8iYmpN58+mE6ygxYjyRdmCl8NUs/emoPw000w8zV1vMEV4Ee1AUgNcHfw== + dependencies: + "@nestjs/common" "^9.4.2" + axios "^0.27.2" + debug "^4.3.4" + json-stringify-safe "^5.0.1" + lodash "^4.17.21" + nest-winston "^1.9.2" + pino-abstract-transport "^1.0.0" + reflect-metadata "^0.1.13" + rxjs "^7.8.1" + strip-ansi "^6.0.1" + tslib "^2.5.3" + winston "^3.9.0" + winston-transport "^4.5.0" + +"@hyperdx/node-opentelemetry@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@hyperdx/node-opentelemetry/-/node-opentelemetry-0.2.2.tgz#ea71db69fbd6166136850c31dd1b648f8a5c1447" + integrity sha512-kOjhGr9hZ12xc6ulcrpXXHUzCXrimYLdNDptZctSJRp+3SrEzt+BuXR6HsszVVJdi+rlm4q+7HIthMWfPdZkgQ== + dependencies: + "@hyperdx/node-logger" "^0.2.7" + "@opentelemetry/api" "^1.4.1" + "@opentelemetry/auto-instrumentations-node" "^0.38.0" + "@opentelemetry/exporter-metrics-otlp-proto" "^0.41.2" + "@opentelemetry/exporter-trace-otlp-proto" "^0.41.2" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/sdk-metrics" "^1.15.2" + "@opentelemetry/sdk-node" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.15.2" + debug "^4.3.4" + lodash "^4.17.21" + shimmer "^1.2.1" + tslib "^2.5.3" + +"@hyperdx/otel-web-session-recorder@0.16.2-11": + version "0.16.2-11" + resolved "https://registry.yarnpkg.com/@hyperdx/otel-web-session-recorder/-/otel-web-session-recorder-0.16.2-11.tgz#96ca62e04f00f7bcce880a847ccd3a0aec66da0a" + integrity sha512-ZZHH7c9q/+iyUhAEfz6lgT+x74y+hyhAj5kmxIiYF5g6l2b4+wTc6i6Cei3UCbIssQY7E/0NZEvqc/ijjFDVqw== + dependencies: + "@babel/runtime" "~7.18.3" + "@opentelemetry/api" "^1.4.1" + "@opentelemetry/core" "^1.14.0" + "@opentelemetry/resources" "^1.14.0" + fflate "^0.7.4" + protobufjs "~6.11.2" + rrweb "^1.1.3" + type-fest "^3.7.2" + +"@hyperdx/otel-web@0.16.2-11": + version "0.16.2-11" + resolved "https://registry.yarnpkg.com/@hyperdx/otel-web/-/otel-web-0.16.2-11.tgz#4784813fc6743a217d4d02d1f8e9e56bcfddbf23" + integrity sha512-ssT7bkOKJZVLs4R6tEWgeDhfNpXh/nzH0kaLr99GxWuLz3A73d8nXzH5/wBHfk1oH3GIjUcMoO8cRZMOEI9Qwg== + dependencies: + "@babel/runtime" "^7.21.0" + "@opentelemetry/api" "^1.4.1" + "@opentelemetry/core" "^1.14.0" + "@opentelemetry/exporter-trace-otlp-http" "^0.40.0" + "@opentelemetry/exporter-zipkin" "^1.14.0" + "@opentelemetry/instrumentation" "^0.40.0" + "@opentelemetry/instrumentation-document-load" "^0.32.3" + "@opentelemetry/instrumentation-fetch" "^0.40.0" + "@opentelemetry/instrumentation-user-interaction" "^0.32.4" + "@opentelemetry/instrumentation-xml-http-request" "^0.40.0" + "@opentelemetry/resources" "^1.14.0" + "@opentelemetry/sdk-trace-base" "^1.14.0" + "@opentelemetry/sdk-trace-web" "^1.14.0" + "@opentelemetry/semantic-conventions" "^1.14.0" + json-stringify-safe "^5.0.1" + lodash "^4.17.21" + shimmer "^1.2.1" + web-vitals "^3.3.2" + +"@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@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@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 "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/environment@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" + integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA== + dependencies: + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + +"@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + dependencies: + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + +"@jest/environment@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.3.tgz#9fe2f3169c3b33815dc4bd3960a064a83eba6548" + integrity sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA== + dependencies: + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + jest-mock "^29.4.3" + +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect-utils@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.3.tgz#95ce4df62952f071bcd618225ac7c47eaa81431e" + integrity sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" + integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ== + dependencies: + "@jest/types" "^25.5.0" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" + lolex "^5.0.0" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +"@jest/fake-timers@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.3.tgz#31e982638c60fa657d310d4b9d24e023064027b0" + integrity sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw== + dependencies: + "@jest/types" "^29.4.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.4.3" + jest-mock "^29.4.3" + jest-util "^29.4.3" + +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" + +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + "@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 "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + dependencies: + "@jridgewell/trace-mapping" "^0.3.13" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" + integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + 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", "@jridgewell/resolve-uri@^3.0.3": + 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/set-array@^1.0.0", "@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", "@jridgewell/sourcemap-codec@^1.4.10": + 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/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.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@lukeed/csprng@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" + integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA== + +"@mdx-js/mdx@^2.1.3": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" + integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/mdx" "^2.0.0" + estree-util-build-jsx "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-util-to-js "^1.1.0" + estree-walker "^3.0.0" + hast-util-to-estree "^2.0.0" + markdown-extensions "^1.0.0" + periscopic "^3.0.0" + remark-mdx "^2.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + unified "^10.0.0" + unist-util-position-from-estree "^1.0.0" + unist-util-stringify-position "^3.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + +"@mdx-js/react@^2.1.5": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" + integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== + dependencies: + "@types/mdx" "^2.0.0" + "@types/react" ">=16" + +"@microsoft/fetch-event-source@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" + integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA== + +"@monaco-editor/loader@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.2.tgz#04effbb87052d19cd7d3c9d81c0635490f9bb6d8" + integrity sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.3.1": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.6.tgz#8ae500b0edf85276d860ed702e7056c316548218" + integrity sha512-Gr3uz3LYf33wlFE3eRnta4RxP5FSNxiIV9ENn2D2/rN8KgGAD8ecvcITRtsbbyuOuNkwbuHYxfeaz2Vr+CtyFA== + dependencies: + "@monaco-editor/loader" "^1.3.2" + prop-types "^15.7.2" + +"@mongodb-js/saslprep@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz#022fa36620a7287d17acd05c4aae1e5f390d250d" + integrity sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw== + dependencies: + sparse-bitfield "^3.0.3" + +"@napi-rs/simple-git-android-arm-eabi@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz#303bea1ec00db24466e3b3ba13de337d87c5371b" + integrity sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g== + +"@napi-rs/simple-git-android-arm64@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz#42c8d04287364fd1619002629fa52183dcf462ee" + integrity sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g== + +"@napi-rs/simple-git-darwin-arm64@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz#e210808e6d646d6efecea84c67ced8eb44a8f821" + integrity sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ== + +"@napi-rs/simple-git-darwin-x64@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz#d717525c33e0dfd8a6d6215da2fcbc0ad40011e1" + integrity sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA== + +"@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz#03e7b2dd299c10e61bbf29f405ea74f6571cf6a1" + integrity sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ== + +"@napi-rs/simple-git-linux-arm64-gnu@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz#945123f75c9a36fd0364e789ce06cd29a74a43cc" + integrity sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA== + +"@napi-rs/simple-git-linux-arm64-musl@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz#2c20a0bff7c08f60b033ed7056dcb07bbbff8310" + integrity sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow== + +"@napi-rs/simple-git-linux-x64-gnu@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz#980e22b7376252a0767298ec801d374d97553da1" + integrity sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw== + +"@napi-rs/simple-git-linux-x64-musl@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz#edca3b2833dc5d3fc9151f5b931f7b14478ccca4" + integrity sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ== + +"@napi-rs/simple-git-win32-arm64-msvc@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz#3ac4c7fe816a2cdafabd091ded76161d1ba1fe88" + integrity sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA== + +"@napi-rs/simple-git-win32-x64-msvc@0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz#3b825bc2cb1c7ff535a3ca03768142d68bbf5c19" + integrity sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew== + +"@napi-rs/simple-git@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.8.tgz#391cb58436d50bd32d924611d45bdc41f5e7607a" + integrity sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA== + optionalDependencies: + "@napi-rs/simple-git-android-arm-eabi" "0.1.8" + "@napi-rs/simple-git-android-arm64" "0.1.8" + "@napi-rs/simple-git-darwin-arm64" "0.1.8" + "@napi-rs/simple-git-darwin-x64" "0.1.8" + "@napi-rs/simple-git-linux-arm-gnueabihf" "0.1.8" + "@napi-rs/simple-git-linux-arm64-gnu" "0.1.8" + "@napi-rs/simple-git-linux-arm64-musl" "0.1.8" + "@napi-rs/simple-git-linux-x64-gnu" "0.1.8" + "@napi-rs/simple-git-linux-x64-musl" "0.1.8" + "@napi-rs/simple-git-win32-arm64-msvc" "0.1.8" + "@napi-rs/simple-git-win32-x64-msvc" "0.1.8" + +"@nestjs/common@^9.4.2": + version "9.4.3" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-9.4.3.tgz#f907c5315b4273f7675864a05c4dda7056632b87" + integrity sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig== + dependencies: + uid "2.0.2" + iterare "1.2.1" + tslib "2.5.3" + +"@next/env@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.4.tgz#c787837d36fcad75d72ff8df6b57482027d64a47" + integrity sha512-H/69Lc5Q02dq3o+dxxy5O/oNxFsZpdL6WREtOOtOM1B/weonIwDXkekr1KV5DPVPr12IHFPrMrcJQ6bgPMfn7A== + +"@next/eslint-plugin-next@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.4.tgz#e7dc00e2e89ed361f111d687b8534483ec15518b" + integrity sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og== + dependencies: + glob "7.1.7" + +"@next/swc-android-arm-eabi@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.4.tgz#fd1c2dafe92066c6120761c6a39d19e666dc5dd0" + integrity sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA== + +"@next/swc-android-arm64@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.4.tgz#11a146dae7b8bca007239b21c616e83f77b19ed4" + integrity sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg== + +"@next/swc-darwin-arm64@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.4.tgz#14ac8357010c95e67327f47082af9c9d75d5be79" + integrity sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA== + +"@next/swc-darwin-x64@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.4.tgz#e7dc63cd2ac26d15fb84d4d2997207fb9ba7da0f" + integrity sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ== + +"@next/swc-freebsd-x64@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.4.tgz#fe7ceec58746fdf03f1fcb37ec1331c28e76af93" + integrity sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ== + +"@next/swc-linux-arm-gnueabihf@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.4.tgz#d7016934d02bfc8bd69818ffb0ae364b77b17af7" + integrity sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw== + +"@next/swc-linux-arm64-gnu@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.4.tgz#43a7bc409b03487bff5beb99479cacdc7bd29af5" + integrity sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA== + +"@next/swc-linux-arm64-musl@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.4.tgz#4d1db6de6dc982b974cd1c52937111e3e4a34bd3" + integrity sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ== + +"@next/swc-linux-x64-gnu@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.4.tgz#c3b414d77bab08b35f7dd8943d5586f0adb15e38" + integrity sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag== + +"@next/swc-linux-x64-musl@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.4.tgz#187a883ec09eb2442a5ebf126826e19037313c61" + integrity sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg== + +"@next/swc-win32-arm64-msvc@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.4.tgz#89befa84e453ed2ef9a888f375eba565a0fde80b" + integrity sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ== + +"@next/swc-win32-ia32-msvc@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.4.tgz#cb50c08f0e40ead63642a7f269f0c8254261f17c" + integrity sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ== + +"@next/swc-win32-x64-msvc@12.3.4": + version "12.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.4.tgz#d28ea15a72cdcf96201c60a43e9630cd7fda168f" + integrity sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg== + +"@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" + +"@nrwl/devkit@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.8.1.tgz#18f90c9bddbac182ca2cd6b08c90f09caf9f4aa0" + integrity sha512-Y7yYDh62Hi4q99Q4+ipIQ3K9iLuAld3WcwjLv6vtl6Livu+TU3eqbraBEno7DQL8JuIuwgBT4lX7Bp3w3N9RDg== + dependencies: + "@nx/devkit" "16.8.1" + +"@nrwl/tao@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.8.1.tgz#640522eef8905f358ce087e1f6a8489c69e3ebfb" + integrity sha512-hgGFLyEgONSofxnJsXN9NlUx4J8/YSLUkfZKdR8Qa97+JGZT8FEuk7NLFJOWdYYqROoCzXLHK0d+twFFNPS5BQ== + dependencies: + nx "16.8.1" + tslib "^2.3.0" + +"@nrwl/workspace@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-16.8.1.tgz#2b046bf1002387464248157cf62e00db32f7cfaf" + integrity sha512-KFxcUoOfzCEc5Krq3h+EC6kOYHCwuSPyc2v1fWvTgP7a91uw5NPsMKGt4l0QXElkX3/qbBvjex6fJOcjf+odYQ== + dependencies: + "@nx/workspace" "16.8.1" + +"@nx/devkit@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.8.1.tgz#830a6f3daf774aabe1a95e257eb4c832ee85d497" + integrity sha512-I+Cg+lXk0wRz6KC9FZbWFuJWQTXAt5O3bNl9ksISmzqmEyuy72Cv+/MBHvF7o54Sq80DNw+RKWB1re5HFOsqCA== + dependencies: + "@nrwl/devkit" "16.8.1" + ejs "^3.1.7" + enquirer "~2.3.6" + ignore "^5.0.4" + semver "7.5.3" + tmp "~0.2.1" + tslib "^2.3.0" + +"@nx/nx-darwin-arm64@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.8.1.tgz#fd85ed007d63d232700272cd07138ecac046525d" + integrity sha512-xOflqyIVcyLPzdJOZcucI+5ClwnTgK8zIvpjbxHokrO9McJJglhfUyP0bbTHpEpWqzA+GaPA/6/Qdu0ATzqQBQ== + +"@nx/nx-darwin-x64@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.8.1.tgz#de75b5052cb7ec93e238af632f0ea0f2d8822e66" + integrity sha512-JJGrlOvEpDMWnM6YKaA1WOnzHgiw5vRKEowX9ba+jxhmCvtdjbLSxi228kv92JtQPPQ91zvtsNM+BFY0EbPOlA== + +"@nx/nx-freebsd-x64@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.8.1.tgz#733dbe731af814b87a1429d7c087c4879192536c" + integrity sha512-aZdJQ7cIQfXOmfk4vRXvVYxuV68xz8YyhNZ0IvBfJ16uZQ+YNl4BpklRLEIdaloSbwz9M1NNewmL+AgklEBxlA== + +"@nx/nx-linux-arm-gnueabihf@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.8.1.tgz#3d1e2130d26ecc335df21bf8a8afa566bd6b4ed5" + integrity sha512-JzjrTf7FFgikoVUbRs0hKvwHRR6SyqT4yIdk/YyiCt2mWY9w4m5DWtHM/9kJzhckkH9MY66m+X/zG6+NKsEMvg== + +"@nx/nx-linux-arm64-gnu@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.8.1.tgz#f0f96dc4be17cac8a387367eaafe71a6b1948fc3" + integrity sha512-CF0s981myBWusW7iW2+fKPa7ceYYe+NO5EdKe9l27fpHDkcA71KZU3q7U823QpO/7tYvVdBevJp3CCn2/GBURQ== + +"@nx/nx-linux-arm64-musl@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.8.1.tgz#65ed581e702ef882afd9d7f25b660e34e4c13690" + integrity sha512-X4TobxRt1dALvoeKC3/t1CqZCMUqtEhGG+KQLT/51sG54HdxmTAWRFlvj8PvLH0QSBk4e+uRZAo45qpt3iSnBg== + +"@nx/nx-linux-x64-gnu@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.8.1.tgz#cc5c782a67e5b17f4e395d358d87ea5076606dba" + integrity sha512-lHvv2FD14Lpxh7muMLStH2tC1opQOaepO4nXwb1LaaoIpMym7kBgCK8AQuI98/oNQiMDXMNDKWQZCjxnJGDIPw== + +"@nx/nx-linux-x64-musl@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.8.1.tgz#2837fb7d6590b5fe9f2eb42603d0e064771a8ded" + integrity sha512-c4gQvNgIjggD1A5sYhftQEC1PtAhV3sEnv60X00v9wmjl57Wj4Ty0TgyzpYglLysVRiko/B58S8NYS0jKvMmeA== + +"@nx/nx-win32-arm64-msvc@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.8.1.tgz#d45d8abdd99f3b0dda83a673592299ffdc819895" + integrity sha512-GKHPy/MyGFoV9cdKgcWLZZK2vDdxt5bQ53ss0k+BDKRP+YwLKm7tJl23eeM7JdB4GLCBntEQPC+dBqxOA8Ze/w== + +"@nx/nx-win32-x64-msvc@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.8.1.tgz#6ec1930aaf4d9dea19149d6b3d100b2c7e69d582" + integrity sha512-yHZ5FAcx54rVc31R0yIpniepkHMPwaxG23l8E/ZYbL1iPwE/Wc1HeUzUvxUuSXtguRp7ihcRhaUEPkcSl2EAVw== + +"@nx/workspace@16.8.1": + version "16.8.1" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-16.8.1.tgz#c73f11a4eb78c04e442d973c2558bbb08d206753" + integrity sha512-wz5AwqdmRU80slva/Q3UmJAqDRYiPluEcqoBJcr2qW8zhoKYX/uDsYuAdCqr4uP5RokZca3LcXqNdpkOfFJtXg== + dependencies: + "@nrwl/workspace" "16.8.1" + "@nx/devkit" "16.8.1" + chalk "^4.1.0" + enquirer "~2.3.6" + ignore "^5.0.4" + nx "16.8.1" + rxjs "^7.8.0" + tslib "^2.3.0" + yargs-parser "21.1.1" + +"@opentelemetry/api-logs@0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.40.0.tgz#24b75e6d3654c0612c376339daf025d36730fcfd" + integrity sha512-8WRuvGnfnbeR9ifGjLN8kklk2fkd0gBT6aN7NHO9zeYF/6qacAViD3bwAKqGXKnJgl39l1EU41I9diqUjamEEQ== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api-logs@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.41.0.tgz#0626a680bde1c0d0daa320268c8a8dcf58f81b90" + integrity sha512-kopW4ZEKX2mgaPi9jh3lTP+2ixbe0z+tAEOn3v0ZM6jzQl7z+2C1ZZjU1cVYbX+RDGqu7n6BMyv5wmWuqiuKYQ== + dependencies: + "@opentelemetry/api" "^1.0.0" + tslib "^2.3.1" + +"@opentelemetry/api-logs@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.41.2.tgz#600c9b3d79018e7421d2ff7189f41b6d2c987d6a" + integrity sha512-JEV2RAqijAFdWeT6HddYymfnkiRu2ASxoTBr4WsnGJhOjWZkEy6vp+Sx9ozr1NaIODOa2HUyckExIqQjn6qywQ== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" + integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== + +"@opentelemetry/auto-instrumentations-node@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.38.0.tgz#9841ebc87d696aff10cf1ad03b19f5b233868bd2" + integrity sha512-lQXiUAGs79+SkaTycwmtamzH0bsXpGOccl2jNFDztZrCvMn2xD4TJkKm5PuoFp9fnRgtY/vEJck+ViefJnSCdA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/instrumentation-amqplib" "^0.33.0" + "@opentelemetry/instrumentation-aws-lambda" "^0.36.0" + "@opentelemetry/instrumentation-aws-sdk" "^0.35.0" + "@opentelemetry/instrumentation-bunyan" "^0.32.0" + "@opentelemetry/instrumentation-cassandra-driver" "^0.33.0" + "@opentelemetry/instrumentation-connect" "^0.32.0" + "@opentelemetry/instrumentation-dataloader" "^0.5.0" + "@opentelemetry/instrumentation-dns" "^0.32.0" + "@opentelemetry/instrumentation-express" "^0.33.0" + "@opentelemetry/instrumentation-fastify" "^0.32.0" + "@opentelemetry/instrumentation-fs" "^0.8.0" + "@opentelemetry/instrumentation-generic-pool" "^0.32.0" + "@opentelemetry/instrumentation-graphql" "^0.35.0" + "@opentelemetry/instrumentation-grpc" "^0.41.0" + "@opentelemetry/instrumentation-hapi" "^0.32.0" + "@opentelemetry/instrumentation-http" "^0.41.0" + "@opentelemetry/instrumentation-ioredis" "^0.35.0" + "@opentelemetry/instrumentation-knex" "^0.32.0" + "@opentelemetry/instrumentation-koa" "^0.35.0" + "@opentelemetry/instrumentation-lru-memoizer" "^0.33.0" + "@opentelemetry/instrumentation-memcached" "^0.32.0" + "@opentelemetry/instrumentation-mongodb" "^0.36.0" + "@opentelemetry/instrumentation-mongoose" "^0.33.0" + "@opentelemetry/instrumentation-mysql" "^0.34.0" + "@opentelemetry/instrumentation-mysql2" "^0.34.0" + "@opentelemetry/instrumentation-nestjs-core" "^0.33.0" + "@opentelemetry/instrumentation-net" "^0.32.0" + "@opentelemetry/instrumentation-pg" "^0.36.0" + "@opentelemetry/instrumentation-pino" "^0.34.0" + "@opentelemetry/instrumentation-redis" "^0.35.0" + "@opentelemetry/instrumentation-redis-4" "^0.35.0" + "@opentelemetry/instrumentation-restify" "^0.33.0" + "@opentelemetry/instrumentation-router" "^0.33.0" + "@opentelemetry/instrumentation-socket.io" "^0.34.0" + "@opentelemetry/instrumentation-tedious" "^0.6.0" + "@opentelemetry/instrumentation-winston" "^0.32.0" + "@opentelemetry/resource-detector-alibaba-cloud" "^0.28.0" + "@opentelemetry/resource-detector-aws" "^1.3.0" + "@opentelemetry/resource-detector-container" "^0.3.0" + "@opentelemetry/resource-detector-gcp" "^0.29.0" + "@opentelemetry/resources" "^1.12.0" + "@opentelemetry/sdk-node" "^0.41.0" + tslib "^2.3.1" + +"@opentelemetry/context-async-hooks@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.15.0.tgz#134ecbe9096227f72e3178a15287a420a13746a0" + integrity sha512-sfxQOyAyV3WsKswGX0Yx3P+e7t3EtxpF/PC+6e4+rqs88oUfTaP3214iz4GQuuzV9yCG8DRWTZ96J6E/iD0qeA== + dependencies: + tslib "^2.3.1" + +"@opentelemetry/context-async-hooks@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.15.2.tgz#116bd5fef231137198d5bf551e8c0521fbdfe928" + integrity sha512-VAMHG67srGFQDG/N2ns5AyUT9vUcoKpZ/NpJ5fDQIPfJd7t3ju+aHwvDsMcrYBWuCh03U3Ky6o16+872CZchBg== + +"@opentelemetry/core@1.12.0", "@opentelemetry/core@^1.0.0", "@opentelemetry/core@^1.8.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.12.0.tgz#afa32341b794045c54c979d4561de2f8f00d0da9" + integrity sha512-4DWYNb3dLs2mSCGl65jY3aEgbvPWSHVQV/dmDWiYeWUrMakZQFcymqZOSUNZO0uDrEJoxMu8O5tZktX6UKFwag== + dependencies: + "@opentelemetry/semantic-conventions" "1.12.0" + +"@opentelemetry/core@1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.13.0.tgz#7cdcb4176d260d279b0aa31456c4ce2ba7f410aa" + integrity sha512-2dBX3Sj99H96uwJKvc2w9NOiNgbvAO6mOFJFramNkKfS9O4Um+VWgpnlAazoYjT6kUJ1MP70KQ5ngD4ed+4NUw== + dependencies: + "@opentelemetry/semantic-conventions" "1.13.0" + +"@opentelemetry/core@1.14.0", "@opentelemetry/core@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.14.0.tgz#64e876b29cb736c984d54164cd47433f513eafd3" + integrity sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw== + dependencies: + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/core@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.15.0.tgz#2ba928df0443732825a72a766c2edae9a7f9863f" + integrity sha512-GGTS6BytfaN8OgbCUOnxg/a9WVsVUj0484zXHZuBzvIXx7V4Tmkb0IHnnhS7Q0cBLNLgjNuvrCpQaP8fIvO4bg== + dependencies: + "@opentelemetry/semantic-conventions" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/core@1.15.2", "@opentelemetry/core@^1.1.0": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.15.2.tgz#5b170bf223a2333884bbc2d29d95812cdbda7c9f" + integrity sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw== + dependencies: + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/exporter-jaeger@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.15.0.tgz#c76430ac49da42fe993fa238bc702051cf2778eb" + integrity sha512-45TAQUqQiuGKkrm535qT0Vs4iJD8/irrHhsscUZPGogEHCu3GVhmc66vf1FleC+ASyv2ySUeXSmfIV3K3tqRHA== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + "@opentelemetry/semantic-conventions" "1.15.0" + jaeger-client "^3.15.0" + tslib "^2.3.1" + +"@opentelemetry/exporter-jaeger@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.15.2.tgz#1ac7020d798ec4e47417bd90e00763e0947e17de" + integrity sha512-BwYd5836GYvuiQcF4l5X0ca09jGJr/F37MMGyz94VH0b1dp0uYBwRJw2CQh56RlVZEdpKv29JyDRVZ/4UrRgLQ== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + jaeger-client "^3.15.0" + +"@opentelemetry/exporter-metrics-otlp-http@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.41.2.tgz#b4e5483d00d913daec950a07784e459d1c60fb3d" + integrity sha512-+YeIcL4nuldWE89K8NBLImpXCvih04u1MBnn8EzvoywG2TKR5JC3CZEPepODIxlsfGSgP8W5khCEP1NHZzftYw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-metrics" "1.15.2" + +"@opentelemetry/exporter-metrics-otlp-proto@^0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.41.2.tgz#dc4f651688e8ba732036f1b140e77fd2592d5769" + integrity sha512-OLNs6wF84uhxn8TJ8Bv1q2ltdJqjKA9oUEtICcUDDzXIiztPxZ9ur/4xdMk9T3ZJeFMfrhj8eYDkpETBy+fjCg== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/exporter-metrics-otlp-http" "0.41.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-proto-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-metrics" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-grpc@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.41.0.tgz#73cde454df5219d94626554ddce9ddad6fa0a869" + integrity sha512-LYy4aP/vICUG9kyyEKu4HvG+FezINb9UNVK4XJhPXfp8dTyILA1dlNqgZlemZPMTgi3Vfz12VoESMQo8UYYyaA== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.0" + "@opentelemetry/otlp-grpc-exporter-base" "0.41.0" + "@opentelemetry/otlp-transformer" "0.41.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/exporter-trace-otlp-grpc@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.41.2.tgz#445f850f4675e0afc3e326b2663576fa0b5fbee4" + integrity sha512-tRM/mq7PFj7mXCws5ICMVp/rmgU93JvZdoLE0uLj4tugNz231u2ZgeRYXulBjdeHM88ZQSsWTJMu2mvr/3JV1A== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-grpc-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-http@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.41.0.tgz#54b412e28018daa3164a3857a7fc05ce61579b0e" + integrity sha512-xG/EJAphB8SFi635vUWJ7rNOwU2nTSIWz1zCu1G6tzQUcej5M1FYtTuUeoJ+HrjHUDOq0SgFbvzfFh6ReggWMQ== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/otlp-exporter-base" "0.41.0" + "@opentelemetry/otlp-transformer" "0.41.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/exporter-trace-otlp-http@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.41.2.tgz#4818088c652f2077a55c9c1364d8320e994dc00f" + integrity sha512-Y0fGLipjZXLMelWtlS1/MDtrPxf25oM408KukRdkN31a1MEFo4h/ZkNwS7ZfmqHGUa+4rWRt2bi6JBiqy7Ytgw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-http@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.40.0.tgz#23d10d51d79f4da5613f7a39876f100442882020" + integrity sha512-H6NcL/he8Eqc4W3ZrtM9xuQTKK2G971y3VfJI5qgKeJg3UowhBAvgE2Nv4Ul/3e5N0ByREnW/WeVWmkXeBtlmA== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/otlp-exporter-base" "0.40.0" + "@opentelemetry/otlp-transformer" "0.40.0" + "@opentelemetry/resources" "1.14.0" + "@opentelemetry/sdk-trace-base" "1.14.0" + +"@opentelemetry/exporter-trace-otlp-proto@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.41.0.tgz#89a039fd682a164d618bac10ffd230445330c75a" + integrity sha512-rDx9uJGpBkvWwwmUk68F3ScowHoCrG5Q1IY0ED4Yx74nS9+KhgigN8IiSXlJyjzmw4IFxL1byNctbKlJ95090Q== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/otlp-exporter-base" "0.41.0" + "@opentelemetry/otlp-proto-exporter-base" "0.41.0" + "@opentelemetry/otlp-transformer" "0.41.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/exporter-trace-otlp-proto@0.41.2", "@opentelemetry/exporter-trace-otlp-proto@^0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.41.2.tgz#8e8f823d5264e34dc7c8b400f9d03871c7bfcbc5" + integrity sha512-IGZga9IIckqYE3IpRE9FO9G5umabObIrChlXUHYpMJtDgx797dsb3qXCvLeuAwB+HoB8NsEZstlzmLnoa6/HmA== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-proto-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-zipkin@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.15.0.tgz#16316fd3137cf71ed6634368c3aa878cd834cd0f" + integrity sha512-vBE8vingVgT9jD8M2WTzhsSnkN0XPR5zEZeoy0KZzt+0g2tRyvb7qWVGucadU+nIq4Z3vhUoN855ZuInE+YJgQ== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + "@opentelemetry/semantic-conventions" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/exporter-zipkin@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.15.2.tgz#4f72482909fd7a197fb614fc1f285b15ca008a39" + integrity sha512-j9dPe8tyx4KqIqJAfZ/LCYfkF9+ggsT0V1+bVg9ZKTBNcLf5dTsTMdcxUxc/9s599kgcn6UERnti/tozbzwa6Q== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/exporter-zipkin@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.14.0.tgz#54f3c462003a2013726c5ba4b08938a262f62969" + integrity sha512-S/R83ocJ7HjmPCbvNGphfEGiVtPY9Viq9mW1kfF9wW9dmM56+EIgKFVOcvcKJh3b01JQT5/bEtOORwlhJ2U2+g== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/resources" "1.14.0" + "@opentelemetry/sdk-trace-base" "1.14.0" + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/instrumentation-amqplib@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.33.1.tgz#a459073939691a4a1dabf96ef7c1af168fb27e35" + integrity sha512-Eg797WDHVDcRr6+5tihh7ab+ZjS5yCOoW4PkUYCcJHVT31AGfi+PlkLgHknW+uT1oKijMC4D1p6jDa/2rzRv/g== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-aws-lambda@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.36.0.tgz#bfd3ffac407a1339fc0bdc9afb4bb9e2dfe2ef39" + integrity sha512-GkehkjN4vHTc5HNIBlKddrm+EVch2cNEfbLcV7tXLu0Hu95kt6PPOwxHDYRxgvu1auFpJY0epUzmPd11zI706A== + dependencies: + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/propagator-aws-xray" "^1.3.0" + "@opentelemetry/resources" "^1.8.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/aws-lambda" "8.10.81" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-aws-sdk@^0.35.0": + version "0.35.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.35.0.tgz#359f56c956afbf526d729e1e8f7d1c28347afaef" + integrity sha512-jKf2nuTe3kYhtINGmgaVlw54q5pgX959zK2abGdvoUSdSP3Pv36YwNZk1K+jAKCN4I71R8/Qp1driAuKKj/Kxg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/propagation-utils" "^0.30.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-bunyan@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.32.1.tgz#ed315aa3ed6c5e47733c1c74d116c46a5ac1d468" + integrity sha512-TjH357ldA5DpK09XUDWffqV9Km++N9H0dwmxHrElM2TSe4Usgkgw6mlodbuh45hoVDD+cCPi+GO6Dq1QLVEdZg== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@types/bunyan" "1.8.8" + +"@opentelemetry/instrumentation-cassandra-driver@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.33.1.tgz#c68af7c975deb1e5793d2051ca327a5834a5037f" + integrity sha512-nn8XtLB1XmViEAnNnZ43jHojYxgNJ1W+QF2B3yBmfVqXJnE0IbzhIiPmU+Zx3ZSzIoWS0EQQM3ljcgDC03FZ7A== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-connect@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.32.1.tgz#020bcaf1b384e0c4a60b2023ffcdc89e998eb2c1" + integrity sha512-QHi0hTXtqZj3wSyvKwFmkGYHRnGdl8w76MHZj3Rekxe4ILpcn78fZGJSbA+0eYdOWHnGP0c483uMOeGH08XYmA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/connect" "3.4.35" + +"@opentelemetry/instrumentation-dataloader@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.5.1.tgz#1b63770793ceedacb42051b22b6a5eb7b54b26d8" + integrity sha512-dqYITnlCo7FSZ8mhyxh9TtogwcebGcuMaXTjYDyIKGshDcjCxhvhNjFDe4y3RD/g/EFKINkYVkVXB1lDqZdxTA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-dns@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.32.1.tgz#cb0e24e1e2f043112461e533aa7bdaf3389c3d7f" + integrity sha512-WtfwHITUUs2CkRCDT+hbSBy4+ltHIvQDbl/B7TZLQHwpZ6jTRQFsCBzPdhgND4XpHvsXDfLhQihguXyXRGILkg== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + semver "^7.3.2" + +"@opentelemetry/instrumentation-document-load@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-document-load/-/instrumentation-document-load-0.32.3.tgz#74e96181b4e3e69e2254778cf8c970e9552cf049" + integrity sha512-eK7ywJXlXsVYzAqpX8RikpEvJFIUOtKCybCdq68lsv2MVwx0Jev0Kycc+q+1mvKQBuhvEVk/5WEUSV9bbVn6qQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.40.0" + "@opentelemetry/sdk-trace-base" "^1.0.0" + "@opentelemetry/sdk-trace-web" "^1.8.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-express@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-express/-/instrumentation-express-0.33.1.tgz#0710f839d2a395014d2ffef9390074bb60009841" + integrity sha512-awrpiTZWnLOCJ4TeDMTrs6/gH/oXbNipoPx3WUKQlA1yfMlpNynqokTyCYv1n10Zu9Y2P/nIhoNnUw0ywp61nA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/express" "4.17.17" + +"@opentelemetry/instrumentation-fastify@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.32.1.tgz#59a2bcb9c0d233c9893ab3c73e951800caa87ab5" + integrity sha512-DGWWGAe8SCULvqlJpL2zJ7o1gYzmhAfKRjJrWmwyZshnjGEw3PQ3b1GHivoxZ6zB7D6ykttxanQovrAKk83WoA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-fetch@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.40.0.tgz#e568ff8abbeb5854938dca65a9f60bc2b589ad3d" + integrity sha512-2rjcU5EO5etuO0bV3WkQ7CU0U4EugdH8FB0USiV7J1VyT2+OYNRZtwwcMQ2uh/2DwjJeEf7dTgpx3tNy5s+eZg== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/instrumentation" "0.40.0" + "@opentelemetry/sdk-trace-web" "1.14.0" + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/instrumentation-fs@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.8.1.tgz#752f286d285374afd65e92ba721c9fa9119b67ac" + integrity sha512-a5U6ydfqVeT4Zp6GL5lZDZNJAmic3CCtgg/f2yqvnpq2fE0cyD/XlW9JWzGhAJaq29E1bxtb9FJ0n6ee3c9dYQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-generic-pool@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.32.1.tgz#ae5f58a07eac37e1ac2a797ad9b38d94764b3be8" + integrity sha512-uTsiAq9A486eKi4hSqDi5vF5TZK0KGdLn5CBqhVvc3oPTz2We69etGKqyv2sV51LwX749iRNHbVFDm2Km+wMSQ== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/generic-pool" "^3.1.9" + +"@opentelemetry/instrumentation-graphql@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.35.1.tgz#e49ec2256bcc4820458688abac0212ac781864c0" + integrity sha512-bAM4W5wU0lZ1UIKK/5b4p8LEU8N6W+VgpcnUIK7GTTDxdhcWTd3Q6oyS6nauhZSzEnAEmmJVXaLQAGIU4sEkyA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-grpc@^0.41.0": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.41.2.tgz#38b51eda1bcb6bf8d422410fa4596b56b03e98ab" + integrity sha512-+fh9GUFv97p25CMreUv4OdP5L21hPgfX3d4fuQ0KIgIZIaX2M6/8cr5Ik+8zWsyhYzfFX3CKq6BXm3UBg7cswQ== + dependencies: + "@opentelemetry/instrumentation" "0.41.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/instrumentation-hapi@^0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.32.0.tgz#59362dab5d2a2d7fdfe47bda0cd75dec923b0ece" + integrity sha512-Wl43lSVqqJZAxhWE1BWlV9yoInEOGiKeGqNhphoGJLqblmlF8Yxob1t2fK/wTj2srmmm1XU70olwhN09uOQxpg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/hapi__hapi" "20.0.9" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-http@^0.41.0": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.41.2.tgz#dad5a693eaad2113ce7ed089fa46ef98d79f2bfc" + integrity sha512-dzOC6xkfK0LM6Dzo91aInLdSbdIzKA0IgSDnyLi6YZ0Z7c1bfrFncFx/3gZs8vi+KXLALgfMlpzE7IYDW/cM3A== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/instrumentation" "0.41.2" + "@opentelemetry/semantic-conventions" "1.15.2" + semver "^7.5.1" + +"@opentelemetry/instrumentation-ioredis@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.35.1.tgz#86d77dc0878707ab456ccebf78233cb0e7127635" + integrity sha512-lixraoS9rs81783QRjQ56/S5KzVBllC+zs7UJuTGODi5Egn/YMGp5lNnlbkUxeJl9LMyADMiP7ZGpQtfKwdc3g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/ioredis4" "npm:@types/ioredis@^4.28.10" + +"@opentelemetry/instrumentation-knex@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.32.1.tgz#0c21b1d35be82a9e1732879192a373b145453ed8" + integrity sha512-s+5BtsYUendDTrWAxkr50X3+kb+sVffFzp4z5DC+aZt52P/kF85wm6GyC1mREvvhhK2UKrCq2yMVKD90z0FKsA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-koa@^0.35.0": + version "0.35.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.35.0.tgz#499ff61accd398e2444c0e52f008be88eec8fb33" + integrity sha512-Q/KclXdHKE3sGlalxxX43lx4b8eY5lv5LSdG3mY8aBsrmw1Mx6Cv4VAeqA4ecCygeapTmf9jjOLmgro15IJ3AQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/koa" "2.13.6" + "@types/koa__router" "8.0.7" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-lru-memoizer@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.33.1.tgz#636343165dfd83ed66d14abdc19f0e4c070cb1a3" + integrity sha512-1FFOlGTEigMWppEkv7o+IyeyWTXXpFAfmcFjJRph5m88RsotgzPLCnxaSeS0GMU7E8UJplusNmmsnu7jPJ2YqA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-memcached@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.32.1.tgz#7b21aa22d90d37f353d6cc2220c98390227f5396" + integrity sha512-laolY41/k6KHYnBQrWpnMlEK49/g8/OQBtvSiPdHiF46wW3eWpXmaTGMRksrRGUtyE+VMRhf7WIDRUYLZULP1g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/memcached" "^2.2.6" + +"@opentelemetry/instrumentation-mongodb@^0.36.0": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.36.1.tgz#a92e48f2cb4e2e2de430d900c96e21911709e137" + integrity sha512-//FdYXGcUO08Y1tVPXlcEvUYCnRU8tlBgYBe3ZMjF7E1GMaFti4Xy6sAHVreyl0ZQjBTaGtHdyORHIOTKUM4ZA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/sdk-metrics" "^1.9.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mongoose@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.33.1.tgz#0e37eed215fb7fbf8adc0e70199bb8992cb1ea21" + integrity sha512-IzYcEZSmlaOlkyACt8gTl0z3eEQafxzEAt/+W+FdNBiUdm81qpVx/1bpzJwSgIsgcLf27Dl5WsPmrSAi4+Bcng== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-mysql2@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.34.1.tgz#d7ce741a7d9a7da270fa791e1c64d8cedd58b5b7" + integrity sha512-SPwgLI2H+gH+GP7b5cWQlFqO/7UeHvw6ZzFKxwLr4vy8wmxYF4aBMLc8qVO8bdXFHd114v0IzOIAvpG6sl/zYQ== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + +"@opentelemetry/instrumentation-mysql@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.34.1.tgz#9703d21615dd5ee6b9eda1d74029ba75eec46c9a" + integrity sha512-zQq7hN3ILm1vIJCGeKHRc4pTK8LOmkTt8oKWf0v+whFs7axieIhXZMoCqIBm6BigLy3Trg5iaKyuSrx7kO6q2g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/mysql" "2.15.21" + +"@opentelemetry/instrumentation-nestjs-core@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.33.1.tgz#a6e0175bcda25e455339a5527268e746be969297" + integrity sha512-Y5Khvp8ODA6TuDcZKAc63cYDeeZAA/n0ceF0pcVCJwA2NBeD0hmTrCJXES2cvt7wVbHV/SYCu7OpYDQkNjbBWw== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-net@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-net/-/instrumentation-net-0.32.1.tgz#7b394b5250f160b46f2363d37c1ebe7c8c1ac6b7" + integrity sha512-r9YC8fFDi+B/JiNfMn+vJaOpgdA83bQM3u4mW9mJi2hAI/LcvjJYPx4aTRLWAPSd/HRG/Olzdvx5LdWvzL8LHg== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-pg@^0.36.0": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.36.1.tgz#66e3aa10948c6e3188d04676dbf304ae8571ce2f" + integrity sha512-k8L7RSRTQ6e+DbHEXZB8Tmf/efkQnWKeClpZb3TEdb34Pvme4PmcpG2zb6JtM99nNrshNlVDLCZ90U3xDneTbw== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@opentelemetry/sql-common" "^0.40.0" + "@types/pg" "8.6.1" + "@types/pg-pool" "2.0.3" + +"@opentelemetry/instrumentation-pino@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.34.1.tgz#7567d2e2298536229f5a72c6c222b79b3b6689c7" + integrity sha512-/FW/wxTshwwmiSE8KgVoWvfjxz5omKBdDbP0McKZk84V02lwwJk0m7+kc2cSOed5rk7iprpZolwO8a8AFVanNA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-redis-4@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.35.1.tgz#40ae092c04ef9f92148197f8b3fe9eef4657123e" + integrity sha512-tQ07wvtjUbHSvvhPPvWyZjYTSzVBTpC746ro5szLnniodvxtKkmP/N+R9KyFXfyH7wwaLIR1Scgq3XSGSppt+Q== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-redis@^0.35.0": + version "0.35.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.35.1.tgz#d821e8d0e9470c9ab144aa45292ec7991dca6bb1" + integrity sha512-zY7eTzGyJCMX/0o04Q9yLy7gllf7Zh4s+g7Kv1d2cMLtTt9zGSlncqj49uNCnneywnpMNRUIwcmd+Ch1bQeh+g== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/redis-common" "^0.36.1" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-restify@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.33.0.tgz#4f7fbcda93e428052c07d6edc05c192e868917be" + integrity sha512-evDjcF6M9G+KH/GCjtUx9Vnm/CBZ9CBfmm/RP6Aeo20y6Kset1ZEoPK79JT7JK1sCPqViBPoj4qnFePz9/20lg== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.41.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + tslib "^2.3.1" + +"@opentelemetry/instrumentation-router@^0.33.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-router/-/instrumentation-router-0.33.1.tgz#ec37e7470675a442e48c2e9e4753f595951c16d8" + integrity sha512-nz8PvjYMQWFgR17Yc5Sj624CamhXP021mWaWfHx6RhI6o67sPt+DT5468yZJZV1gMnaOSQfiBkjWZ7AGQkRutw== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-socket.io@^0.34.0": + version "0.34.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.34.1.tgz#ac5814f8a805a550c9e63e5f7f9ac4186ec8d579" + integrity sha512-v9US0hXJaY7dkKOC2/CMLB526wn9F3CQrkeVUidvSm+AxFBoYXKdAUJijdBPWT4PKY98/VjFHuZ3HSe4QD8zPA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/instrumentation-tedious@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.6.1.tgz#2b488581161839c19ef0641d0afdc9fa6cc8210b" + integrity sha512-zwgLKmWtAn0XsMb98aMaI7gCawzPqpy+LOgGTlYmUdqSVYnzMAn4QKrx24Rrd5pgmzOEIbAWHlpN7pOc1eIqxA== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + "@opentelemetry/semantic-conventions" "^1.0.0" + "@types/tedious" "^4.0.6" + +"@opentelemetry/instrumentation-user-interaction@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-user-interaction/-/instrumentation-user-interaction-0.32.4.tgz#26c3dd7bc1270877b16b0845c096e183d61e4aa6" + integrity sha512-keFfcPuKhtfvHgBCG7VdlwRP7ezpWqbwCinTPRnMDRvFqcGVgk6HwPXkbMDs2CtQm+a1Hal7Tg93RYy82F6XEA== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.40.0" + "@opentelemetry/sdk-trace-web" "^1.8.0" + +"@opentelemetry/instrumentation-winston@^0.32.0": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.32.1.tgz#0548543151ac7505cffc64c0019ca3d5bdda5638" + integrity sha512-wgXb2W2cbNdRQfXTH0jcnfbhlVPapmu13Wqhedj2pMpXS2aBnWAdvNFlArS6q84MEhzv3A4fVevjbwXa4uCzwQ== + dependencies: + "@opentelemetry/instrumentation" "^0.41.2" + +"@opentelemetry/instrumentation-xml-http-request@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.40.0.tgz#ab9d3f779e766044467182f65c216a8f51451ac9" + integrity sha512-T+79t3cKc2wjCFCDo0pUbGHMYBDEQX+IuMxtplDKIuCqbyjn0gBhi+n5KE/P07s0AWjRuJkGjRoY+gERfc5dJA== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/instrumentation" "0.40.0" + "@opentelemetry/sdk-trace-web" "1.14.0" + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/instrumentation@0.40.0", "@opentelemetry/instrumentation@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.40.0.tgz#13d5f2d60c3fafef124ab6961a32204f7ef8bb25" + integrity sha512-23TzBKPflUS1uEq5SXymnQKQDSda35KvHjnvxdcDQGE+wg6hwDHgScUCWiBmZW4sxAaPcANfs+Wc9B7yDuyT6Q== + dependencies: + "@types/shimmer" "^1.0.2" + import-in-the-middle "1.3.5" + require-in-the-middle "^7.1.0" + semver "^7.3.2" + shimmer "^1.2.1" + +"@opentelemetry/instrumentation@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.41.0.tgz#a67a7f6d215d8802c2e956907a913b793037e04d" + integrity sha512-Ut9SnZfi7MexOk+GHCMjEtYHogIb6v1dfbnq+oTbQj0lOQUSNLtlO6bXwUdtmPhbvrx6bC0AGr1L6g3rNimv9w== + dependencies: + "@types/shimmer" "^1.0.2" + import-in-the-middle "1.4.1" + require-in-the-middle "^7.1.1" + semver "^7.5.1" + shimmer "^1.2.1" + tslib "^2.3.1" + +"@opentelemetry/instrumentation@0.41.2", "@opentelemetry/instrumentation@^0.41.0", "@opentelemetry/instrumentation@^0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz#cae11fa64485dcf03dae331f35b315b64bc6189f" + integrity sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw== + dependencies: + "@types/shimmer" "^1.0.2" + import-in-the-middle "1.4.2" + require-in-the-middle "^7.1.1" + semver "^7.5.1" + shimmer "^1.2.1" + +"@opentelemetry/otlp-exporter-base@0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.40.0.tgz#34568717b86cfdc9743d4a7c43606a67118458b3" + integrity sha512-AUmMUPM1/oYGbOWYRBBQz4Ic/adMYA/mIMnAy+QAEmCzjBIC/fyRReVhJmF2cpkvYh7QOkX3017zl2dgWLHpvQ== + dependencies: + "@opentelemetry/core" "1.14.0" + +"@opentelemetry/otlp-exporter-base@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.0.tgz#f9d61c66b94b2f7c5b3be8dea919cfc99fca25b9" + integrity sha512-fSHtZznIU6kvCLFQC77nOhHj059G1sc/wNl96YiPdro4A8t8ue//ET0yAtpRCQ9lynn4RNrpsw5iEFJszEbmLg== + dependencies: + "@opentelemetry/core" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/otlp-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.2.tgz#5928dfedb2a70117f03809862cf2cbdf8b7f9bf3" + integrity sha512-pfwa6d+Dax3itZcGWiA0AoXeVaCuZbbqUTsCtOysd2re8C2PWXNxDONUfBWsn+KgxAdi+ljwTjJGiaVLDaIEvQ== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/otlp-grpc-exporter-base@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.41.0.tgz#95eb3dac919b113bedb38f1231b9563ac98b0b43" + integrity sha512-TdbZ46i2kKeGKE9SCZFiSt1iTLHS+DniEaWbVsIhEPOLZXl8TGzzi1FjR/Q3gG/vlblYZ/MdgXHgRIGVG5qIDw== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.0" + "@opentelemetry/otlp-exporter-base" "0.41.0" + protobufjs "^7.2.3" + tslib "^2.3.1" + +"@opentelemetry/otlp-grpc-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.41.2.tgz#b056915aa274947517ac86b0c78533db274404e8" + integrity sha512-OErK8dYjXG01XIMIpmOV2SzL9ctkZ0Nyhf2UumICOAKtgLvR5dG1JMlsNVp8Jn0RzpsKc6Urv7JpP69wzRXN+A== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-proto-exporter-base@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.41.0.tgz#3425ded083279d43d4118b03e0042503eb9283a3" + integrity sha512-VY/7y8ne72PIzPxFN3uzHfrmxo9rCDWP08/fY3iodjizCxmCCRFM4Sb7VX0ZSrjakL1mLXFd0FSwe71AsAtM9A== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/otlp-exporter-base" "0.41.0" + protobufjs "^7.2.3" + tslib "^2.3.1" + +"@opentelemetry/otlp-proto-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.41.2.tgz#10b1a4bb973bd6e0e741931d90f22387c5a3a151" + integrity sha512-BxmEMiP6tHiFroe5/dTt9BsxCci7BTLtF7A6d4DKHLiLweWWZxQ9l7hON7qt/IhpKrQcAFD1OzZ1Gq2ZkNzhCw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-transformer@0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.40.0.tgz#9b0aa9883f78ad36259e9f7a791e39b48d13c402" + integrity sha512-YrJgVVAsJHibENSbYmC1x+5jAmkAGZ9yrgmHxc6IyqM3D1mryhqBvMRDD31JoavPYelkS7dmrXWM8g7swX0B+g== + dependencies: + "@opentelemetry/api-logs" "0.40.0" + "@opentelemetry/core" "1.14.0" + "@opentelemetry/resources" "1.14.0" + "@opentelemetry/sdk-logs" "0.40.0" + "@opentelemetry/sdk-metrics" "1.14.0" + "@opentelemetry/sdk-trace-base" "1.14.0" + +"@opentelemetry/otlp-transformer@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.0.tgz#5c370e6fb929829d8e13cb4c72e28542456da24d" + integrity sha512-a5GqVSdVIhAoYcQrdWQAeMbrkz0iDwKC6BUsuqPuykh+T4QZzrF6cwneOXKbQI5Dl7ms6ha9dYHf4Ka0kc66ZQ== + dependencies: + "@opentelemetry/api-logs" "0.41.0" + "@opentelemetry/core" "1.15.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/sdk-logs" "0.41.0" + "@opentelemetry/sdk-metrics" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/otlp-transformer@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz#cd3a7185ef77fe9b7b4c2d2f9e001fa1d2fa6cf8" + integrity sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA== + dependencies: + "@opentelemetry/api-logs" "0.41.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-logs" "0.41.2" + "@opentelemetry/sdk-metrics" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/propagation-utils@^0.30.0": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagation-utils/-/propagation-utils-0.30.1.tgz#2fbb48cec2c118d14e5814258990973fca5e2860" + integrity sha512-GCZg19gBSOTCeHvSCVy08WUyKAp2LyIRcRQPZk8MMAbmz8JWha3huBS9tNXjB4hYwRqW2SJOZzoYjt2P/BxvEw== + +"@opentelemetry/propagator-aws-xray@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz#7fc77a95fe89c705442b0e5a4218422c2954cc07" + integrity sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ== + dependencies: + "@opentelemetry/core" "^1.0.0" + +"@opentelemetry/propagator-b3@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.15.0.tgz#502c3b7030646e7654ce243ae24b67aeac405a53" + integrity sha512-YafSIITpCmo76VdlJ/GvS5x+uuRWCU5BqCOV9CITi11Tk4aqTxMR3pXlMoPYQWstUUgacQf4dGcdvdS+1rkDWQ== + dependencies: + "@opentelemetry/core" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/propagator-b3@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.15.2.tgz#7bcb9fa645042a440922669fbac06a1a91e6704b" + integrity sha512-ZSrL3DpMEDsjD8dPt9Ze3ue53nEXJt512KyxXlLgLWnSNbe1mrWaXWkh7OLDoVJh9LqFw+tlvAhDVt/x3DaFGg== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/propagator-jaeger@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.15.0.tgz#098cfebe885f8c0f4ed3073aa9a7c0aa253086c8" + integrity sha512-OU6WNxuqjxNZoRcIBCsmvTBktAPuBUj1bh+DI+oYAvzwP2NXLavSDJWjVMGTJQDgZuR7lFijmx9EfwyAO9x37Q== + dependencies: + "@opentelemetry/core" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/propagator-jaeger@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.15.2.tgz#90757fc9529da806a1845f502acb6d0eb821e3db" + integrity sha512-6m1yu7PVDIRz6BwA36lacfBZJCfAEHKgu+kSyukNwVdVjsTNeyD9xNPQnkl0WN7Rvhk8/yWJ83tLPEyGhk1wCQ== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/redis-common@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz#79bca902603dd27862223a751be0f4bb0be54c2b" + integrity sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw== + +"@opentelemetry/resource-detector-alibaba-cloud@^0.28.0": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.1.tgz#f65bfc25d0f26d55bce33a8caa788274353445cf" + integrity sha512-0ucRgwid6bSAgYL5fiTkLh7aS9cPyz+Ijyv961SZbpMeIgVBvU931676xrdGNqlmuxavt24BrNUUWZ4XKq8ViA== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-aws@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.1.tgz#4d221859c19b0e4e604ac88224129e82a78ec8b6" + integrity sha512-1n3U0ns0xlA8EIOMY1oEP5+5rZE/nfhIld6nw8T8PK4PkS3kAQb1ZCj3RXajs3qA+qWWIaEvCNREx3A0Ifyt3Q== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-container@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.1.tgz#7b59f5c9d2062db78f3dd2e2c59adbfafdd7d5a9" + integrity sha512-7zQASISRLmsaCKurvaoi7kTa0ab4iQEvPVfRo4k5RLSVi4puaCcC+2qOd6Fk4jEqNueevhyn2upGUeH+0EJ6yQ== + dependencies: + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + +"@opentelemetry/resource-detector-gcp@^0.29.0": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.1.tgz#eef9a08fbac816f3906a327be508e77f23a15a90" + integrity sha512-u5mB53I49m0cXQ97dgZlgEnNin9xqwl9au2sXmblHG9XS6PocGoAgAiXGYYvITWhR3ID5Ei2GyGoJDFdAtCrVA== + dependencies: + "@opentelemetry/core" "^1.0.0" + "@opentelemetry/resources" "^1.0.0" + "@opentelemetry/semantic-conventions" "^1.0.0" + gcp-metadata "^5.0.0" + +"@opentelemetry/resources@1.12.0", "@opentelemetry/resources@^1.8.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.12.0.tgz#895394c727dc3e7e51d1d2cc50907ec07a626dca" + integrity sha512-gunMKXG0hJrR0LXrqh7BVbziA/+iJBL3ZbXCXO64uY+SrExkwoyJkpiq9l5ismkGF/A20mDEV7tGwh+KyPw00Q== + dependencies: + "@opentelemetry/core" "1.12.0" + "@opentelemetry/semantic-conventions" "1.12.0" + +"@opentelemetry/resources@1.14.0", "@opentelemetry/resources@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.14.0.tgz#d6b0a4e71c2706d33c8c6ec7a7b8fea6ad27ddea" + integrity sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/resources@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.15.0.tgz#748a6ae9017636b8b30f5dee1fff3e166e51f63d" + integrity sha512-Sb8A6ZXHXDlgHv32UNRE3y8McWE3vkb5dsSttYArYa5ZpwjiF5ge0vnnKUUnG7bY0AgF9VBIOORZE8gsrnD2WA== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/semantic-conventions" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/resources@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.15.2.tgz#0c9e26cb65652a1402834a3c030cce6028d6dd9d" + integrity sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/resources@^1.0.0", "@opentelemetry/resources@^1.12.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.13.0.tgz#436b33ea950004e66fce6575f2776a05faca7f8e" + integrity sha512-euqjOkiN6xhjE//0vQYGvbStxoD/WWQRhDiO0OTLlnLBO9Yw2Gd/VoSx2H+svsebjzYk5OxLuREBmcdw6rbUNg== + dependencies: + "@opentelemetry/core" "1.13.0" + "@opentelemetry/semantic-conventions" "1.13.0" + +"@opentelemetry/sdk-logs@0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.40.0.tgz#cc5d6da4e1ecb22a7e2425be7969b8e491999d7f" + integrity sha512-/JG7DOLo/Y3VR9azPXlXNRGQff3gp7nQbWl5cFD2SmlYqUrzMq1OjbksZLVztDu1+ynbFunseUG11SxhoxvSRg== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/resources" "1.14.0" + +"@opentelemetry/sdk-logs@0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.41.0.tgz#576a29bc3ca91d92754447250e85fffc3b661013" + integrity sha512-+Qs8uHcd/tYKS1n6lfSPiQXMOuyPN0c3xKeyWjD5mExRvmA1H6SIYfZmB6KeQNXWODK4z4JtWo5g5Efe0gJ1Vg== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/resources" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/sdk-logs@0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.41.2.tgz#c3eeb6793bdfa52351d66e2e66637e433abed672" + integrity sha512-smqKIw0tTW15waj7BAPHFomii5c3aHnSE4LQYTszGoK5P9nZs8tEAIpu15UBxi3aG31ZfsLmm4EUQkjckdlFrw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + +"@opentelemetry/sdk-metrics@1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.14.0.tgz#ee51d72eb32a74108e6632681ce2df46cddc0714" + integrity sha512-F0JXmLqT4LmsaiaE28fl0qMtc5w0YuMWTHt1hnANTNX8hxW4IKSv9+wrYG7BZd61HEbPm032Re7fXyzzNA6nIw== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/resources" "1.14.0" + lodash.merge "4.6.2" + +"@opentelemetry/sdk-metrics@1.15.0", "@opentelemetry/sdk-metrics@^1.9.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.0.tgz#e47ad688882fc2daedcbbe3db16a5c110feb23e8" + integrity sha512-fFUnAcPvlXO39nlIduGuaeCuiZyFtSLCn9gW/0djFRO5DFst4m4gcT6+llXvNWuUvtGB49s56NP10B9IZRN0Rw== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/resources" "1.15.0" + lodash.merge "^4.6.2" + tslib "^2.3.1" + +"@opentelemetry/sdk-metrics@1.15.2", "@opentelemetry/sdk-metrics@^1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.2.tgz#eadd0a049de9cd860e1e0d49eea01156469c4b60" + integrity sha512-9aIlcX8GnhcsAHW/Wl8bzk4ZnWTpNlLtud+fxUfBtFATu6OZ6TrGrF4JkT9EVrnoxwtPIDtjHdEsSjOqisY/iA== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + lodash.merge "^4.6.2" + +"@opentelemetry/sdk-node@^0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.41.0.tgz#9fd4a2271868b2440fc60018473f5ae5c4536af2" + integrity sha512-NJt14iU2kGZR8vO8xF5dEsj+57hocUgmvWDv5VccM67B8khH29ZebzrczvRyC2bDnxRdMdpvc4Nmck/UxLpJuQ== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/exporter-jaeger" "1.15.0" + "@opentelemetry/exporter-trace-otlp-grpc" "0.41.0" + "@opentelemetry/exporter-trace-otlp-http" "0.41.0" + "@opentelemetry/exporter-trace-otlp-proto" "0.41.0" + "@opentelemetry/exporter-zipkin" "1.15.0" + "@opentelemetry/instrumentation" "0.41.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/sdk-metrics" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + "@opentelemetry/sdk-trace-node" "1.15.0" + "@opentelemetry/semantic-conventions" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/sdk-node@^0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-node/-/sdk-node-0.41.2.tgz#7ac2fc149d371a9f17c2adba395a9aa257ed1bf4" + integrity sha512-t3vaB5ajoXLtVFoL8TSoSgaVATmOyUfkIfBE4nvykm0dM2vQjMS/SUUelzR06eiPTbMPsr2UkevWhy2/oXy2vg== + dependencies: + "@opentelemetry/api-logs" "0.41.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/exporter-jaeger" "1.15.2" + "@opentelemetry/exporter-trace-otlp-grpc" "0.41.2" + "@opentelemetry/exporter-trace-otlp-http" "0.41.2" + "@opentelemetry/exporter-trace-otlp-proto" "0.41.2" + "@opentelemetry/exporter-zipkin" "1.15.2" + "@opentelemetry/instrumentation" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-logs" "0.41.2" + "@opentelemetry/sdk-metrics" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + "@opentelemetry/sdk-trace-node" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/sdk-trace-base@1.12.0", "@opentelemetry/sdk-trace-base@^1.0.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.12.0.tgz#62b895dbb5900048a85e4899c38fec5585447d4b" + integrity sha512-pfCOB3tNDlYVoWuz4D7Ji+Jmy9MHnATWHVpkERdCEiwUGEZ+4IvNPXUcPc37wJVmMpjGLeaWgPPrie0KIpWf1A== + dependencies: + "@opentelemetry/core" "1.12.0" + "@opentelemetry/resources" "1.12.0" + "@opentelemetry/semantic-conventions" "1.12.0" + +"@opentelemetry/sdk-trace-base@1.14.0", "@opentelemetry/sdk-trace-base@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.14.0.tgz#831af08f002228a11e577ff860eb6059c8b80fb7" + integrity sha512-NzRGt3PS+HPKfQYMb6Iy8YYc5OKA73qDwci/6ujOIvyW9vcqBJSWbjZ8FeLEAmuatUB5WrRhEKu9b0sIiIYTrQ== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/resources" "1.14.0" + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/sdk-trace-base@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.0.tgz#92340ded8f9fec1aaa63afb40c6e7e01769c2852" + integrity sha512-udt1c9VHipbZwvCPIQR1VLg25Z4AMR/g0X8KmcInbFruGWQ/lptVPkz3yvWAsGSta5yHNQ3uoPwcyCygGnQ6Lg== + dependencies: + "@opentelemetry/core" "1.15.0" + "@opentelemetry/resources" "1.15.0" + "@opentelemetry/semantic-conventions" "1.15.0" + tslib "^2.3.1" + +"@opentelemetry/sdk-trace-base@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz#4821f94033c55a6c8bbd35ae387b715b6108517a" + integrity sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/sdk-trace-node@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.15.0.tgz#2d49eafb070a6a53e8df7e91dab30ec2370ba310" + integrity sha512-TKBx9oThZUVKkoGpXhFT/XUgpjq28TWwc6j3JlsL+cJX77DKBnVC+2H+kdVVJHRzyfqDx4LEJJVCwQO3K+cbXA== + dependencies: + "@opentelemetry/context-async-hooks" "1.15.0" + "@opentelemetry/core" "1.15.0" + "@opentelemetry/propagator-b3" "1.15.0" + "@opentelemetry/propagator-jaeger" "1.15.0" + "@opentelemetry/sdk-trace-base" "1.15.0" + semver "^7.5.1" + tslib "^2.3.1" + +"@opentelemetry/sdk-trace-node@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.15.2.tgz#987c929597ca274995164508f57a15f682d9de2f" + integrity sha512-5deakfKLCbPpKJRCE2GPI8LBE2LezyvR17y3t37ZI3sbaeogtyxmBaFV+slmG9fN8OaIT+EUsm1QAT1+z59gbQ== + dependencies: + "@opentelemetry/context-async-hooks" "1.15.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/propagator-b3" "1.15.2" + "@opentelemetry/propagator-jaeger" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + semver "^7.5.1" + +"@opentelemetry/sdk-trace-web@1.14.0", "@opentelemetry/sdk-trace-web@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.14.0.tgz#7e272f7b247eff2801ccfd4aeb40134898e25a08" + integrity sha512-W8oNs2gUzP0lZ1VT7lI70aEKJ+MEshqpKDc+0o52nnRur0Z5AKI8/l57qXHXGD+31ImYvOGiY8OiSK6/8GCrZQ== + dependencies: + "@opentelemetry/core" "1.14.0" + "@opentelemetry/sdk-trace-base" "1.14.0" + "@opentelemetry/semantic-conventions" "1.14.0" + +"@opentelemetry/sdk-trace-web@^1.8.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.12.0.tgz#400511122d952a4a6bc9aeb2492d2acc00caa98e" + integrity sha512-i89anQYHSOamzXEkoMh2xr0Ms8qTQ9dseqHOTBUMOqCVxwj18DJFJC7TwNtVliusZQ0hAbnsPG+V5+/67aNmFg== + dependencies: + "@opentelemetry/core" "1.12.0" + "@opentelemetry/sdk-trace-base" "1.12.0" + "@opentelemetry/semantic-conventions" "1.12.0" + +"@opentelemetry/semantic-conventions@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz#19c959bdb900986e74939d4227e757aa16936b91" + integrity sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA== + +"@opentelemetry/semantic-conventions@1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.13.0.tgz#0290398b3eaebc6029c348988a78c3b688fe9219" + integrity sha512-LMGqfSZkaMQXqewO0o1wvWr/2fQdCh4a3Sqlxka/UsJCe0cfLulh6x2aqnKLnsrSGiCq5rSCwvINd152i0nCqw== + +"@opentelemetry/semantic-conventions@1.14.0", "@opentelemetry/semantic-conventions@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz#6a729b7f372ce30f77a3f217c09bc216f863fccb" + integrity sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug== + +"@opentelemetry/semantic-conventions@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.0.tgz#e6173daa5fd61f353b02c858001388bf26e9d059" + integrity sha512-f3wwFrFyCpGrFBrFs7lCUJSCSCGyeKG52c+EKeobs3Dd29M75yO6GYkt6PkYPfDawxSlV5p+4yJPPk8tPObzTQ== + dependencies: + tslib "^2.3.1" + +"@opentelemetry/semantic-conventions@1.15.2", "@opentelemetry/semantic-conventions@^1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz#3bafb5de3e20e841dff6cb3c66f4d6e9694c4241" + integrity sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw== + +"@opentelemetry/semantic-conventions@^1.0.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz#b7ed9a601acb6e0aef67564b37e4f9abad449170" + integrity sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w== + +"@opentelemetry/sql-common@^0.40.0": + version "0.40.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz#8cbed0722354d62997c3b9e1adf0e16257be6b15" + integrity sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw== + dependencies: + "@opentelemetry/core" "^1.1.0" + +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== + dependencies: + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@popperjs/core@^2.11.6", "@popperjs/core@^2.9.2": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@reach/observe-rect@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" + integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== + +"@react-aria/ssr@^3.4.1": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.5.0.tgz#40c1270a75868185f72a88cafe37bd1392f690cb" + integrity sha512-h0MJdSWOd1qObLnJ8mprU31wI8tmKFJMuwT22MpWq6psisOOZaga6Ml4u6Ee6M6duWWISjXvqO4Sb/J0PBA+nQ== + dependencies: + "@swc/helpers" "^0.4.14" + +"@redis/bloom@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" + integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg== + +"@redis/client@1.5.9": + version "1.5.9" + resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.9.tgz#c4ee81bbfedb4f1d9c7c5e9859661b9388fb4021" + integrity sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ== + dependencies: + cluster-key-slot "1.1.2" + generic-pool "3.9.0" + yallist "4.0.0" + +"@redis/graph@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@redis/graph/-/graph-1.1.0.tgz#cc2b82e5141a29ada2cce7d267a6b74baa6dd519" + integrity sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg== + +"@redis/json@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.4.tgz#f372b5f93324e6ffb7f16aadcbcb4e5c3d39bda1" + integrity sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw== + +"@redis/search@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.3.tgz#b5a6837522ce9028267fe6f50762a8bcfd2e998b" + integrity sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng== + +"@redis/time-series@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.5.tgz#a6d70ef7a0e71e083ea09b967df0a0ed742bc6ad" + integrity sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg== + +"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.9.tgz#ad858fb39d99e252cccce19416adc18fc3f18fcb" + integrity sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ== + dependencies: + dequal "^2.0.2" + +"@restart/ui@^1.4.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.1.tgz#1db9c11f13bafc0546e33fe0e2ffc7de920cb7dd" + integrity sha512-cMI9DdqZV5VGEyANYM4alHK9/2Lh/mKZAMydztMl6PBLm6EetFbwE2RfYqliloR+EtEULlI4TiZk/XPhQAovxw== + dependencies: + "@babel/runtime" "^7.20.7" + "@popperjs/core" "^2.11.6" + "@react-aria/ssr" "^3.4.1" + "@restart/hooks" "^0.4.7" + "@types/warning" "^3.0.0" + dequal "^2.0.3" + dom-helpers "^5.2.0" + uncontrollable "^7.2.1" + warning "^4.0.3" + +"@rrweb/types@^2.0.0-alpha.8": + version "2.0.0-alpha.8" + resolved "https://registry.yarnpkg.com/@rrweb/types/-/types-2.0.0-alpha.8.tgz#29a6550dd833364a459af4be4ce3b233003fb78b" + integrity sha512-yAr6ZQrgmr7+qZU5DMGqYXnVsolC5epftmZtkOtgFD/bbvCWflNnl09M32hUjttlKCV1ohhmQGioXkCQ37IF7A== + dependencies: + rrweb-snapshot "^2.0.0-alpha.8" + +"@rushstack/eslint-patch@^1.1.3": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + +"@sentry-internal/tracing@7.64.0": + version "7.64.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.64.0.tgz#3e110473b8edf805b799cc91d6ee592830237bb4" + integrity sha512-1XE8W6ki7hHyBvX9hfirnGkKDBKNq3bDJyXS86E0bYVDl94nvbRM9BD9DHsCFetqYkVm1yDGEK+6aUVs4CztoQ== + dependencies: + "@sentry/core" "7.64.0" + "@sentry/types" "7.64.0" + "@sentry/utils" "7.64.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/browser@^7.64.0": + version "7.64.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.64.0.tgz#76db08a5d32ffe7c5aa907f258e6c845ce7f10d7" + integrity sha512-lB2IWUkZavEDclxfLBp554dY10ZNIEvlDZUWWathW+Ws2wRb6PNLtuPUNu12R7Q7z0xpkOLrM1kRNN0OdldgKA== + dependencies: + "@sentry-internal/tracing" "7.64.0" + "@sentry/core" "7.64.0" + "@sentry/replay" "7.64.0" + "@sentry/types" "7.64.0" + "@sentry/utils" "7.64.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/core@7.64.0": + version "7.64.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.64.0.tgz#9d61cdc29ba299dedbdcbe01cfadf94bd0b7df48" + integrity sha512-IzmEyl5sNG7NyEFiyFHEHC+sizsZp9MEw1+RJRLX6U5RITvcsEgcajSkHQFafaBPzRrcxZMdm47Cwhl212LXcw== + dependencies: + "@sentry/types" "7.64.0" + "@sentry/utils" "7.64.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/replay@7.64.0": + version "7.64.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.64.0.tgz#bdf09b0c4712f9dc6b24b3ebefa55a4ac76708e6" + integrity sha512-alaMCZDZhaAVmEyiUnszZnvfdbiZx5MmtMTGrlDd7tYq3K5OA9prdLqqlmfIJYBfYtXF3lD0iZFphOZQD+4CIw== + dependencies: + "@sentry/core" "7.64.0" + "@sentry/types" "7.64.0" + "@sentry/utils" "7.64.0" + +"@sentry/types@7.64.0": + version "7.64.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.64.0.tgz#21fc545ea05c3c8c4c3e518583eca1a8c5429506" + integrity sha512-LqjQprWXjUFRmzIlUjyA+KL+38elgIYmAeoDrdyNVh8MK5IC1W2Lh1Q87b4yOiZeMiIhIVNBd7Ecoh2rodGrGA== + +"@sentry/utils@7.64.0": + version "7.64.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.64.0.tgz#6fe3ce9a56d3433ed32119f914907361a54cc184" + integrity sha512-HRlM1INzK66Gt+F4vCItiwGKAng4gqzCR4C5marsL3qv6SrKH98dQnCGYgXluSWaaa56h97FRQu7TxCk6jkSvQ== + dependencies: + "@sentry/types" "7.64.0" + tslib "^2.4.1 || ^1.9.3" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@slack/types@^1.2.1": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-1.10.0.tgz#cbf7d83e1027f4cbfd13d6b429f120c7fb09127a" + integrity sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg== + +"@slack/types@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.8.0.tgz#11ea10872262a7e6f86f54e5bcd4f91e3a41fe91" + integrity sha512-ghdfZSF0b4NC9ckBA8QnQgC9DJw2ZceDq0BIjjRSv6XAZBXJdWgxIsYz0TYnWSiqsKZGH2ZXbj9jYABZdH3OSQ== + +"@slack/webhook@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-6.1.0.tgz#ac9c8add919f0f5ab9440a24e76b2f83adcc0f2c" + integrity sha512-7AYNISyAjn/lA/VDwZ307K5ft5DojXgBd3DRrGoFN8XxIwIyRALdFhxBiMgAqeJH8eWoktvNwLK24R9hREEqpA== + dependencies: + "@slack/types" "^1.2.1" + "@types/node" ">=12.0.0" + axios "^0.21.4" + +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" + integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" + integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@^6.2.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@swc/helpers@0.4.11": + version "0.4.11" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.11.tgz#db23a376761b3d31c26502122f349a21b592c8de" + integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw== + dependencies: + tslib "^2.4.0" + +"@swc/helpers@^0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + +"@tanstack/react-table@^8.7.9": + version "8.7.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.7.9.tgz#9efcd168fb0080a7e0bc213b5eac8b55513babf4" + integrity sha512-6MbbQn5AupSOkek1+6IYu+1yZNthAKTRZw9tW92Vi6++iRrD1GbI3lKTjJalf8lEEKOqapPzQPE20nywu0PjCA== + dependencies: + "@tanstack/table-core" "8.7.9" + +"@tanstack/react-virtual@^3.0.0-beta.54": + version "3.0.0-beta.54" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.54.tgz#755979455adf13f2584937204a3f38703e446037" + integrity sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ== + dependencies: + "@tanstack/virtual-core" "3.0.0-beta.54" + +"@tanstack/table-core@8.7.9": + version "8.7.9" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.7.9.tgz#0e975f8a5079972f1827a569079943d43257c42f" + integrity sha512-4RkayPMV1oS2SKDXfQbFoct1w5k+pvGpmX18tCXMofK/VDRdA2hhxfsQlMvsJ4oTX8b0CI4Y3GDKn5T425jBCw== + +"@tanstack/virtual-core@3.0.0-beta.54": + version "3.0.0-beta.54" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.54.tgz#12259d007911ad9fce1388385c54a9141f4ecdc4" + integrity sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g== + +"@testing-library/dom@^8.0.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" + integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.16.5": + version "5.16.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + 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@^12.1.4": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" + integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.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@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@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.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + +"@types/airbnb__node-memwatch@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/airbnb__node-memwatch/-/airbnb__node-memwatch-2.0.0.tgz#7d3cfe651c1dee4d7c92202489fafcf7b1feb84f" + integrity sha512-uqGcs6QkoyktUPGm5Lk5aZylG8lyDrZJbPt4GjavKl0n3nMgCQKQwC1Uc8OdwJANV5awaCr81dXPU5Ku3ODGQg== + +"@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/aws-lambda@8.10.81": + version "8.10.81" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.81.tgz#6d405269aad82e05a348687631aa9a587cdbe158" + integrity sha512-C1rFKGVZ8KwqhwBOYlpoybTSRtxu2433ea6JaO3amc6ubEe08yQoFsPa9aU9YqvX7ppeZ25CnCtC4AH9mhtxsQ== + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + 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.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/base16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/base16/-/base16-1.0.2.tgz#eb3a07db52309bfefb9ba010dfdb3c0784971f65" + integrity sha512-oYO/U4VD1DavwrKuCSQWdLG+5K22SLPem2OQaHmFcQuwHoVeGC+JGVRji2MUqZUAIQZHEonOeVfAX09hYiLsdg== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bunyan@1.8.8": + version "1.8.8" + resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.8.tgz#8d6d33f090f37c07e2a80af30ae728450a101008" + integrity sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow== + dependencies: + "@types/node" "*" + +"@types/compression@^1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.3.tgz#2dd34648fc3b71c95aacd63b3098b2192da33929" + integrity sha512-rKquEGjebqizyHNMOpaE/4FdYR5VQiWFeesqYfvJU0seSEyB4625UGhNOO/qIkH10S3wftiV7oefc8WdLZ/gCQ== + dependencies: + "@types/express" "*" + +"@types/connect@*", "@types/connect@3.4.35": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" + integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== + +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + +"@types/cookies@*": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/cors@^2.8.14": + version "2.8.14" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== + dependencies: + "@types/node" "*" + +"@types/css-font-loading-module@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz#2f98ede46acc0975de85c0b7b0ebe06041d24601" + integrity sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q== + +"@types/d3-array@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" + integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== + +"@types/d3-color@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz#6594da178ded6c7c3842f3cc0ac84b156f12f2d4" + integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== + +"@types/d3-ease@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz#c29926f8b596f9dadaeca062a32a45365681eae0" + integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== + +"@types/d3-interpolate@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" + integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + +"@types/d3-scale@^4.0.2": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz#7a5780e934e52b6f63ad9c24b105e33dd58102b5" + integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-shape@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.1.tgz#15cc497751dac31192d7aef4e67a8d2c62354b95" + integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*", "@types/d3-time@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== + +"@types/d3-timer@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" + integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== + +"@types/debug@^4.0.0": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.0.tgz#7bfc979ab9f692b492017df42520f7f765e98df1" + integrity sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express-session@^1.17.7": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.17.7.tgz#ced215c1244cb594be10e39f2781ddcd650be9a6" + integrity sha512-L25080PBYoRLu472HY/HNCxaXY8AaGgqGC8/p/8+BYMhG0RDOLQ1wpXOpAzr4Gi5TGozTKyJv5BVODM5UNyVMw== + dependencies: + "@types/express" "*" + +"@types/express@*", "@types/express@4.17.17", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/extract-domain@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/extract-domain/-/extract-domain-2.3.1.tgz#106cddf94ec6b5e8cfa1ca4bbb09c404f3e3d806" + integrity sha512-M6/YwjwRh/Q6wm9l5ieQCO2pG/yrpmV77FlJfeLQDh2SL2clc9Ye1wGUInThQ3gvgiVZHcrBCz3bVun3Kps84w== + +"@types/generic-pool@^3.1.9": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@types/generic-pool/-/generic-pool-3.8.1.tgz#b9b25b2ba4733057fa5df1818352d3205c48e87b" + integrity sha512-eaMAbZS0EfKvaP5PUZ/Cdf5uJBO2t6T3RdvQTKuMqUwGhNpCnPAsKWEMyV+mCeCQG3UiHrtgdzni8X6DmhxRaQ== + dependencies: + generic-pool "*" + +"@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/hapi__catbox@*": + version "10.2.4" + resolved "https://registry.yarnpkg.com/@types/hapi__catbox/-/hapi__catbox-10.2.4.tgz#4d0531a6c2d0e45024f724020d536041ef8ffe30" + integrity sha512-A6ivRrXD5glmnJna1UAGw87QNZRp/vdFO9U4GS+WhOMWzHnw+oTGkMvg0g6y1930CbeheGOCm7A1qHsqH7AXqg== + +"@types/hapi__hapi@20.0.9": + version "20.0.9" + resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-20.0.9.tgz#9d570846c96268266a14c970c13aeeaccfc8e172" + integrity sha512-fGpKScknCKZityRXdZgpCLGbm41R1ppFgnKHerfZlqOOlCX/jI129S6ghgBqkqCE8m9A0CIu1h7Ch04lD9KOoA== + dependencies: + "@hapi/boom" "^9.0.0" + "@hapi/iron" "^6.0.0" + "@hapi/podium" "^4.1.3" + "@types/hapi__catbox" "*" + "@types/hapi__mimos" "*" + "@types/hapi__shot" "*" + "@types/node" "*" + joi "^17.3.0" + +"@types/hapi__mimos@*": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz#4f8a1c58345fc468553708d3cb508724aa081bd9" + integrity sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ== + dependencies: + "@types/mime-db" "*" + +"@types/hapi__shot@*": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/hapi__shot/-/hapi__shot-4.1.2.tgz#d4011999a91e8101030fece1462fe99769455855" + integrity sha512-8wWgLVP1TeGqgzZtCdt+F+k15DWQvLG1Yv6ZzPfb3D5WIo5/S+GGKtJBVo2uNEcqabP5Ifc71QnJTDnTmw1axA== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/http-assert@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" + integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/hyperdx__lucene@npm:@types/lucene": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/lucene/-/lucene-2.1.4.tgz#b9adbbde81c431ddb5d2e8fb1ddc21995907553e" + integrity sha512-deJK3LkXVe2QZw8stHcbI7SPVvTFHiV0V9LFVvWY9xZBMOR0zCQU4bfr0bXRrl3adsk47jiWpm88opfq7Uw8zw== + +"@types/intercom-web@^2.8.18": + version "2.8.20" + resolved "https://registry.yarnpkg.com/@types/intercom-web/-/intercom-web-2.8.20.tgz#f968ff4a9b452cbf3a41d33801fa5da9e8ba2640" + integrity sha512-pb7VRfDz3DDDOj63VtH906EaYVjVubTbOg8Xiw5hkQBFavuSNxFF3IMU5dpGxSJT2OfmHF6aSAy1GfcsPUHwjw== + +"@types/ioredis4@npm:@types/ioredis@^4.28.10": + version "4.28.10" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.10.tgz#40ceb157a4141088d1394bb87c98ed09a75a06ff" + integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== + 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@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@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.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jest@^28.1.1", "@types/jest@^28.1.6": + version "28.1.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" + integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== + dependencies: + expect "^28.0.0" + pretty-format "^28.0.0" + +"@types/js-cookie@^2.2.6": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" + integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== + +"@types/jsdom@^16.2.4": + version "16.2.15" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.15.tgz#6c09990ec43b054e49636cba4d11d54367fc90d6" + integrity sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ== + dependencies: + "@types/node" "*" + "@types/parse5" "^6.0.3" + "@types/tough-cookie" "*" + +"@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.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@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/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/koa-compose@*": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.5" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61" + integrity sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa@2.13.6": + version "2.13.6" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.6.tgz#6dc14e727baf397310aa6f414ebe5d144983af42" + integrity sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/koa__router@8.0.7": + version "8.0.7" + resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-8.0.7.tgz#663d69d5ddebff5aaca27c0594430b3ba6ea20be" + integrity sha512-OB3Ax75nmTP+WR9AgdzA42DI7YmBtiNKN2g1Wxl+d5Dyek9SWt740t+ukwXSmv/jMBCUPyV3YEI93vZHgdP7UQ== + dependencies: + "@types/koa" "*" + +"@types/lodash@^4.14.178", "@types/lodash@^4.14.182", "@types/lodash@^4.14.186": + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + +"@types/lodash@^4.14.198": + version "4.14.198" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.198.tgz#4d27465257011aedc741a809f1269941fa2c5d4c" + integrity sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg== + +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.3.tgz#43fd32414f17fcbeced3578109a6edd877a2d96e" + integrity sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ== + +"@types/memcached@^2.2.6": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@types/memcached/-/memcached-2.2.7.tgz#b3de026a11a4c0a18fb079cfeeaea10a41da20f9" + integrity sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA== + dependencies: + "@types/node" "*" + +"@types/mime-db@*": + version "1.43.1" + resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.43.1.tgz#c2a0522453bb9b6e84ee48b7eef765d19bcd519e" + integrity sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/minimist@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/ms@*", "@types/ms@^0.7.31": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/mysql@2.15.21": + version "2.15.21" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.21.tgz#7516cba7f9d077f980100c85fd500c8210bd5e45" + integrity sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "18.14.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.1.tgz#90dad8476f1e42797c49d6f8b69aaf9f876fc69f" + integrity sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ== + +"@types/node@>=12.0.0": + version "20.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.0.tgz#9d7daa855d33d4efec8aea88cd66db1c2f0ebe16" + integrity sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg== + +"@types/node@>=12.12.47": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.1.tgz#de559d4b33be9a808fd43372ccee822c70f39704" + integrity sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg== + +"@types/node@>=13.7.0": + version "18.16.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.0.tgz#4668bc392bb6938637b47e98b1f2ed5426f33316" + integrity sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ== + +"@types/oauth@*": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@types/oauth/-/oauth-0.9.1.tgz#e17221e7f7936b0459ae7d006255dff61adca305" + integrity sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A== + dependencies: + "@types/node" "*" + +"@types/object-hash@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-2.2.1.tgz#67c169f8f033e0b62abbf81df2d00f4598d540b9" + integrity sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + +"@types/passport-google-oauth20@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.11.tgz#271ec71de3030a3e1c004b24e633e4b298ccba97" + integrity sha512-9XMT1GfwhZL7UQEiCepLef55RNPHkbrCtsU7rsWPTEOsmu5qVIW8nSemtB4p+P24CuOhA+IKkv8LsPThYghGww== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport-oauth2" "*" + +"@types/passport-http-bearer@^1.0.37": + version "1.0.37" + resolved "https://registry.yarnpkg.com/@types/passport-http-bearer/-/passport-http-bearer-1.0.37.tgz#6882825a46717725f952731d17e1bb0a698155a4" + integrity sha512-/2Z28LfgY7kP/GO75os+feTP+//qHfpYn3V7sWAl0kwNwyDT1eGgjO30OU+Lown00ogSee+fea8a0+fr/UpTXw== + dependencies: + "@types/express" "*" + "@types/koa" "*" + "@types/passport" "*" + +"@types/passport-local@^1.0.34": + version "1.0.35" + resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.35.tgz#233d370431b3f93bb43cf59154fb7519314156d9" + integrity sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport-strategy" "*" + +"@types/passport-oauth2@*": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.12.tgz#c2ae0ee3b16646188d8b0b6cdbc6880a0247dc5f" + integrity sha512-RZg6cYTyEGinrZn/7REYQds6zrTxoBorX1/fdaz5UHzkG8xdFE7QQxkJagCr2ETzGII58FAFDmnmbTUVMrltNA== + dependencies: + "@types/express" "*" + "@types/oauth" "*" + "@types/passport" "*" + +"@types/passport-strategy@*": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.12.tgz#7dc8ab96a5e895ec13688d9e3a96920a7f42e73e" + integrity sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw== + dependencies: + "@types/express" "*" + +"@types/pg-pool@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-2.0.3.tgz#3eb8df2933f617f219a53091ad4080c94ba1c959" + integrity sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg== + dependencies: + "@types/pg" "*" + +"@types/pg@*": + version "8.6.6" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.6.tgz#21cdf873a3e345a6e78f394677e3b3b1b543cb80" + integrity sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + +"@types/pg@8.6.1": + version "8.6.1" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9" + integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + +"@types/pluralize@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c" + integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.5": + 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@*": + 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/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-copy-to-clipboard@^5.0.2": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz#558f2c38a97f53693e537815f6024f1e41e36a7e" + integrity sha512-otTJsJpofYAeaIeOwV5xBUGpo6exXG2HX7X4nseToCB2VgPEBxGBHCm/FecZ676doNR7HCSTVtmohxfG2b3/yQ== + dependencies: + "@types/react" "*" + +"@types/react-csv@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/react-csv/-/react-csv-1.1.3.tgz#b93a33314d71e8e3c5c41b20d19a2912c6e642c8" + integrity sha512-dkEdyRvRpygSnNg4cyzYWSUjukIQ5lAtXJwc7BqyUfzww/Cv2dcAFGYd+sWTFpGiDNZMVPp6vVPLcAPvJID8Kg== + dependencies: + "@types/react" "*" + +"@types/react-datepicker@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@types/react-datepicker/-/react-datepicker-4.10.0.tgz#fcb0e6a7787491bf2f37fbda2b537062608a0056" + integrity sha512-Cq+ks20vBIU6XN67TbkCHu8M7V46Y6vJrKE2n+8q/GfueJyWWTIKeC3Z7cz/d+qxGDq/VCrqA929R0U4lNuztg== + dependencies: + "@popperjs/core" "^2.9.2" + "@types/react" "*" + date-fns "^2.0.1" + react-popper "^2.2.5" + +"@types/react-dom@<18.0.0": + version "17.0.19" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.19.tgz#36feef3aa35d045cacd5ed60fe0eef5272f19492" + integrity sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ== + dependencies: + "@types/react" "^17" + +"@types/react-grid-layout@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/react-grid-layout/-/react-grid-layout-1.3.2.tgz#9f195666a018a5ae2b773887e3b552cb4378d67f" + integrity sha512-ZzpBEOC1JTQ7MGe1h1cPKSLP4jSWuxc+yvT4TsAlEW9+EFPzAf8nxQfFd7ea9gL17Em7PbwJZAsiwfQQBUklZQ== + dependencies: + "@types/react" "*" + +"@types/react-slider@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/react-slider/-/react-slider-1.3.1.tgz#a3816989eb4fc172e7df316930f242fec90690fc" + integrity sha512-4X2yK7RyCIy643YCFL+bc6XNmcnBtt8n88uuyihvcn5G7Lut23eNQU3q3KmwF7MWIfKfsW5NxCjw0SeDZRtgaA== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@^13.5.2": + version "13.5.2" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz#357cc03581dc434c57c3b31f70e0eecdbf7b3ab0" + integrity sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q== + dependencies: + "@types/react" "*" + +"@types/react-table@^7.7.14": + version "7.7.14" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.14.tgz#b880f1ae140ed065bca2e21b3008ca1ebe71595a" + integrity sha512-TYrv7onCiakaG1uAu/UpQ9FojNEt/4/ht87EgJQaEGFoWV606ZLWUZAcUHzMxgc3v1mywP1cDyz3qB4ho3hWOw== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.4": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== + dependencies: + "@types/react" "*" + +"@types/react-virtualized-auto-sizer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" + integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@>=16", "@types/react@>=16.9.11", "@types/react@^17", "@types/react@^17.0.52": + version "17.0.52" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" + integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/serve-static@*": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/shimmer@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.2.tgz#93eb2c243c351f3f17d5c580c7467ae5d686b65f" + integrity sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg== + +"@types/sqlstring@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@types/sqlstring/-/sqlstring-2.3.0.tgz#5960ade0166cfaaa4673fc74ec8157a08d06c89e" + integrity sha512-kMFecDYYFk/f5fljO0UFrSPwU1JxY4mIjX6ic7MHv5nD6sEd3NYLoWcOV/3s6Drs7RHdCwTQdD5NdgVl0I2zzg== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@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/superagent@*": + version "4.1.16" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.16.tgz#12c9c16f232f9d89beab91d69368f96ce8e2d881" + integrity sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" + integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== + dependencies: + "@types/superagent" "*" + +"@types/tedious@^4.0.6": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.9.tgz#baa3892e45c63d7aac54d7bf5b01385d210ff19e" + integrity sha512-ipwFvfy9b2m0gjHsIX0D6NAAwGCKokzf5zJqUZHUGt+7uWVlBIy6n2eyMgiKQ8ChLFVxic/zwQUhjLYNzbHDRA== + dependencies: + "@types/node" "*" + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + 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/unist@*", "@types/unist@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== + +"@types/webidl-conversions@*": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" + integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== + +"@types/whatwg-url@^8.2.1": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" + integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== + dependencies: + "@types/node" "*" + "@types/webidl-conversions" "*" + +"@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@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.46.1", "@typescript-eslint/eslint-plugin@^5.52.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz#24b8b4a952f3c615fe070e3c461dd852b5056734" + integrity sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw== + dependencies: + "@typescript-eslint/scope-manager" "5.53.0" + "@typescript-eslint/type-utils" "5.53.0" + "@typescript-eslint/utils" "5.53.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.21.0", "@typescript-eslint/parser@^5.46.1", "@typescript-eslint/parser@^5.52.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.53.0.tgz#a1f2b9ae73b83181098747e96683f1b249ecab52" + integrity sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ== + dependencies: + "@typescript-eslint/scope-manager" "5.53.0" + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/typescript-estree" "5.53.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz#42b54f280e33c82939275a42649701024f3fafef" + integrity sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w== + dependencies: + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/visitor-keys" "5.53.0" + +"@typescript-eslint/type-utils@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz#41665449935ba9b4e6a1ba6e2a3f4b2c31d6cf97" + integrity sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw== + dependencies: + "@typescript-eslint/typescript-estree" "5.53.0" + "@typescript-eslint/utils" "5.53.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.53.0.tgz#f79eca62b97e518ee124086a21a24f3be267026f" + integrity sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A== + +"@typescript-eslint/typescript-estree@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690" + integrity sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w== + dependencies: + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/visitor-keys" "5.53.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.53.0.tgz#e55eaad9d6fffa120575ffaa530c7e802f13bce8" + integrity sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.53.0" + "@typescript-eslint/types" "5.53.0" + "@typescript-eslint/typescript-estree" "5.53.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.53.0": + version "5.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f" + integrity sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w== + dependencies: + "@typescript-eslint/types" "5.53.0" + eslint-visitor-keys "^3.3.0" + +"@xobotyi/scrollbar-width@^1.9.5": + version "1.9.5" + resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" + integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== + +"@xstate/fsm@^1.4.0": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.6.5.tgz#f599e301997ad7e3c572a0b1ff0696898081bea5" + integrity sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== + dependencies: + js-yaml "^3.10.0" + tslib "^2.4.0" + +"@zkochan/js-yaml@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== + dependencies: + argparse "^2.0.1" + +abab@^2.0.0, abab@^2.0.3, abab@^2.0.5, 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== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.5, accepts@~1.3.8: + 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@^4.1.0, acorn-globals@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +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-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.0.0, 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@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +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@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.0, acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.0, acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +acorn@^8.8.2, 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== + +agent-base@6: + 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" + +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@^6.10.0, ajv@^6.12.3, 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-color@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" + integrity sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ== + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +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.0, 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.1.0, 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: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-to-html@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.7.2.tgz#a92c149e4184b571eb29a0135ca001a8e2d710cb" + integrity sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g== + dependencies: + entities "^2.2.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3, anymatch@~3.1.2: + 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.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +arg@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" + integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== + +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.0.0, 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" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.5, 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-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +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.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +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" + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +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== + +astring@^1.8.0: + version "1.8.4" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.4.tgz#6d4c5d8de7be2ead9e4a3cc0e2efb8d759378904" + integrity sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +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== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +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== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +axe-core@^4.6.2: + version "4.6.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" + integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== + +axios-retry@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.4.0.tgz#f464dbe9408e5aa78fa319afd38bb69b533d8854" + integrity sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA== + dependencies: + "@babel/runtime" "^7.15.4" + is-retry-allowed "^2.2.0" + +axios@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +axios@^1.0.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + dependencies: + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +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@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +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@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== + dependencies: + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +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== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +base64-arraybuffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +big-integer@^1.6.16: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +bignumber.js@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bootstrap@^5.1.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.3.tgz#54739f4414de121b9785c5da3c87b37ff008322b" + integrity sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ== + +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + +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@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, 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" + +broadcast-channel@^3.4.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" + integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== + dependencies: + "@babel/runtime" "^7.7.2" + detect-node "^2.1.0" + js-sha3 "0.8.0" + microseconds "0.2.0" + nano-time "1.0.0" + oblivious-set "1.0.0" + rimraf "3.0.2" + unload "2.2.0" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +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" + +bson@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.2.tgz#320f4ad0eaf5312dd9b45dc369cc48945e2a5f2e" + integrity sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ== + dependencies: + buffer "^5.6.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +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== + +buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufrw@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa" + integrity sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ== + dependencies: + ansi-color "^0.2.1" + error "^7.0.0" + hexer "^1.5.0" + xtend "^4.0.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== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.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, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001449: + version "1.0.30001458" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" + integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: + 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.0.2, chalk@^4.1.0: + 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" + +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== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +check-more-types@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrono-node@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.5.0.tgz#c4d5f4f4db9d72604a5beb79fdc5fd57be4b212f" + integrity sha512-GasdFCw4tsb8UKlwyJW1S+3bdN06vsyGR2cEDMlhEGI7ic4SQRnLyl/hbItwSum6pPkkUTrzFcaR3C2tZnnO5Q== + dependencies: + dayjs "^1.10.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +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.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cjs-module-lexer@^1.2.2: + 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== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +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-cursor@3.1.0, 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-spinners@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +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@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" + integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.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" + +clsx@^1.1.1, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +cluster-key-slot@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + +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.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +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, color@^3.2.1: + 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.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +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.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + 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" + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +compare-versions@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-5.0.3.tgz#a9b34fea217472650ef4a2651d905f42c28ebfd7" + integrity sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A== + +component-emitter@^1.2.1, component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +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" + +compute-scroll-into-view@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.0.tgz#95d2f2f4653e7edda74dd1e38edaaa897918e0f0" + integrity sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ== + +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== + +connect-mongo@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/connect-mongo/-/connect-mongo-4.6.0.tgz#1bf62868efc9f28ecf1459ae9a9d6caaf90ae8a6" + integrity sha512-8new4Z7NLP3CGP65Aw6ls3xDBeKVvHRSh39CXuDZTQsvpeeU9oNMzfFgvqmHqZ6gWpxIl663RyoVEmCAGf1yOg== + dependencies: + debug "^4.3.1" + kruptein "^3.0.0" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, 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== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookiejar@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +copy-to-clipboard@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +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== + +cron-parser@^4.2.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" + integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== + dependencies: + luxon "^3.2.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +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-in-js-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== + dependencies: + hyphenate-style-name "^1.0.3" + +css-selector-parser@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" + integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + +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.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssom@^0.4.1, cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +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== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +cssstyle@^2.0.0, 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.10, csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +csstype@^3.0.6: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: + version "3.2.3" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" + integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== + dependencies: + internmap "1 - 2" + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-shape@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +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== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +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@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +data-urls@^3.0.1, 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" + +date-fns-tz@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-2.0.0.tgz#1b14c386cb8bc16fc56fe333d4fc34ae1d1099d5" + integrity sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ== + +date-fns@^2.0.1, date-fns@^2.24.0, date-fns@^2.28.0, date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +dayjs@^1.10.0: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + 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.x, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + 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-light@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + +decimal.js@^10.2.1, decimal.js@^10.3.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== + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + 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.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3, 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.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + 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" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.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, 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.0, dequal@^2.0.2, dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +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== + +detect-node@^2.0.4, detect-node@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +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== + +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +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== + +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + +dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +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-expand@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@^16.0.2: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +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== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.7: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.284: + version "1.4.311" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz#953bc9a4767f5ce8ec125f9a1ad8e00e8f67e479" + integrity sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +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== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +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" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +error@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw== + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +error@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + 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.4" + is-array-buffer "^3.0.1" + 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.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.1.2: + 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" + +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild@^0.14.47: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + +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-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +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== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escodegen@^1.11.1, escodegen@^1.9.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-next@^12.3.3: + version "12.3.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.3.4.tgz#3d4d9e74b919b879c4cc79c61bdc388fb2b964ee" + integrity sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ== + dependencies: + "@next/eslint-plugin-next" "12.3.4" + "@rushstack/eslint-patch" "^1.1.3" + "@typescript-eslint/parser" "^5.21.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^2.7.1" + eslint-plugin-import "^2.26.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.31.7" + eslint-plugin-react-hooks "^4.5.0" + +eslint-config-prettier@^8.5.0, eslint-config-prettier@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== + +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@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" + integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== + dependencies: + debug "^4.3.4" + glob "^7.2.0" + is-glob "^4.0.3" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + 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-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.31.7: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + 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.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.34.0: + version "8.34.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6" + integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@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.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + 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" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + 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.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +eslint@^8.48.0: + version "8.48.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.48.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + 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.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + 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.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +espree@^9.6.0, espree@^9.6.1: + 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.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.2.tgz#c6d3fee05dd665808e2ad870631f221f5617b1d1" + integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== + dependencies: + estraverse "^5.1.0" + +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@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +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== + +estree-util-attach-comments@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" + integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== + dependencies: + "@types/estree-jsx" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-1.1.0.tgz#2e3488ea06d9ea2face116058864f6370b37456d" + integrity sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ== + +estree-util-is-identifier-name@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== + +estree-util-to-js@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz#1d3125594b4d6680f666644491e7ac1745a3df49" + integrity sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw== + dependencies: + is-plain-obj "^3.0.0" + +estree-util-visit@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^2.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +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== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + +execa@1.0.0, execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^5.0.0: + 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@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + 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" + +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + +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== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^28.0.0, expect@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + +expect@^29.0.0: + version "29.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" + integrity sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg== + dependencies: + "@jest/expect-utils" "^29.4.3" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" + +express-rate-limit@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-6.7.1.tgz#ca93de8eaa25878b539d478948fc94592742e526" + integrity sha512-eH4VgI64Nowd2vC5Xylx0lLYovWIp2gRFtTklWDbhSDydGAPQUjvr1B7aQ2/ZADrAi6bJ51qSizKIXWAZ1WCQw== + +express-session@^1.17.3: + version "1.17.3" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.3.tgz#14b997a15ed43e5949cb1d073725675dd2777f36" + integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== + dependencies: + cookie "0.4.2" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" + +express-winston@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/express-winston/-/express-winston-4.2.0.tgz#e9d535d52aa4c125a54a29cce132ae2e3633f4fa" + integrity sha512-EMD74g63nVHi7pFleQw7KHCxiA1pjF5uCwbCfzGqmFxs9KvlDPIVS3cMGpULm6MshExMT9TjC3SqmRGB9kb7yw== + dependencies: + chalk "^2.4.2" + lodash "^4.17.21" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-domain@^2.4.1: + version "2.4.8" + resolved "https://registry.yarnpkg.com/extract-domain/-/extract-domain-2.4.8.tgz#7430cdc7a50d1630983f669c76bff530031e65b8" + integrity sha512-a8iBD5igEYApP22uMSkRy02s4IaUaJ54phxHWRxbQXgTkzXfhOMoXN0kWzo8hqfZRZRebuLyKecXZSlMvHOLNg== + optionalDependencies: + psl "^1.8.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +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-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-equals@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-4.0.3.tgz#72884cc805ec3c6679b99875f6b7654f39f0e8c7" + integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg== + +fast-glob@3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + 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-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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: + 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, 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-loops@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" + integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" + integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== + +fast-xml-parser@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" + integrity sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg== + dependencies: + strnum "^1.0.5" + +fastest-stable-stringify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76" + integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== + +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" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +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" + +fflate@^0.4.4: + version "0.4.8" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" + integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== + +fflate@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" + integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw== + +figures@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +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" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +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" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +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" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +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== + +flexsearch@^0.7.21: + version "0.7.31" + resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.31.tgz#065d4110b95083110b9b6c762a71a77cc52e4702" + integrity sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA== + +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== + +focus-visible@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" + integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== + +follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +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" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +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" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +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" + +formidable@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== + dependencies: + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.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@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.3.2, 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: + 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== + +fuse.js@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" + integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== + +gaxios@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.0.tgz#133b77b45532be71eec72012b7e97c2320b6140a" + integrity sha512-aezGIjb+/VfsJtIcHGcBSerNEDdfdHeMros+RbYbGpmonKWQCOVOes0LVZhn1lDtIgq55qq0HaxymIoae3Fl/A== + dependencies: + extend "^3.0.2" + https-proxy-agent "^5.0.0" + is-stream "^2.0.0" + node-fetch "^2.6.7" + +gcp-metadata@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.2.0.tgz#b4772e9c5976241f5d3e69c4f446c906d25506ec" + integrity sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw== + dependencies: + gaxios "^5.0.0" + json-bigint "^1.0.0" + +generaterr@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/generaterr/-/generaterr-1.5.0.tgz#b0ceb6cc5164df2a061338cc340a8615395c52fc" + integrity sha512-JgcGRv2yUKeboLvvNrq9Bm90P4iJBu7/vd5wSLYqMG5GJ6SxZT46LAAkMfNhQ+EK3jzC+cRBm7P8aUWYyphgcQ== + +generic-pool@*, generic-pool@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" + integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== + +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: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-node-dimensions@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz#fb7b4bb57060fb4247dd51c9d690dfbec56b0823" + integrity sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ== + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +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-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +git-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== + dependencies: + is-ssh "^1.4.0" + parse-url "^8.1.0" + +git-url-parse@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" + integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== + dependencies: + git-up "^7.0.0" + +github-slugger@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +github-slugger@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== + +glob-parent@^5.1.2, 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@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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@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@^7.1.3, glob@^7.1.4, glob@^7.2.0: + 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" + +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +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" + +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.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== + +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.1, 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-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +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" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-to-estree@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.2.tgz#11ab0cd2e70ecf0305151af56e636b1cdfbba0bf" + integrity sha512-YYDwATNdnvZi3Qi84iatPIl1lWpXba1MeNrNbDfJfVzEBZL8uUmtR7mt7bxKBC8kuAuvb0bkojXYZzsNHyHCLg== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + estree-util-attach-comments "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + hast-util-whitespace "^2.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdxjs-esm "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.1" + unist-util-position "^4.0.0" + zwitch "^2.0.0" + +hast-util-to-string@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz#9b24c114866bdb9478927d7e9c36a485ac728378" + integrity sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w== + +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hexer@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653" + integrity sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg== + dependencies: + ansi-color "^0.2.1" + minimist "^1.1.0" + process "^0.10.0" + xtend "^4.0.0" + +hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +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-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +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" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +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@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== + +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== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3: + 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" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.0.4, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immer@^9.0.21: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +immutable@^4.0.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" + integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== + +import-fresh@^3.0.0, 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-in-the-middle@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.3.5.tgz#78384fbcfc7c08faf2b1f61cb94e7dd25651df9c" + integrity sha512-yzHlBqi1EBFrkieAnSt8eTgO5oLSl+YJ7qaOpUH/PMqQOMZoQ/RmDlwnTLQrwYto+gHYjRG+i/IbsB1eDx32NQ== + dependencies: + module-details-from-path "^1.0.3" + +import-in-the-middle@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.1.tgz#31b25123bc35d556986a172bb398a3e6c32af9be" + integrity sha512-hGG0PcCsykVo8MBVH8l0uEWLWW6DXMgJA9jvC0yps6M3uIJ8L/tagTCbyF8Ud5TtqJ8/jmZL1YkyySyeVkVQrA== + dependencies: + acorn "^8.8.2" + acorn-import-assertions "^1.9.0" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + +import-in-the-middle@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b" + integrity sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw== + dependencies: + acorn "^8.8.2" + acorn-import-assertions "^1.9.0" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + +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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inline-style-prefixer@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz#4290ed453ab0e4441583284ad86e41ad88384f44" + integrity sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg== + dependencies: + css-in-js-utils "^3.1.0" + fast-loops "^1.1.3" + +internal-slot@^1.0.3, internal-slot@^1.0.4: + 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" + +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +intersection-observer@^0.12.2: + version "0.12.2" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" + integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== + +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== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +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: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + 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-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +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-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +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-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +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-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +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, is-glob@~4.0.1: + 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-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +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-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +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-reference@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" + integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== + dependencies: + "@types/estree" "*" + +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-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + +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-ssh@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== + dependencies: + protocols "^2.0.1" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +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.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +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-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +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@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +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== + +isemail@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== + dependencies: + punycode "2.x.x" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +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@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +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.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.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.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + +jaeger-client@^3.15.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.19.0.tgz#9b5bd818ebd24e818616ee0f5cffe1722a53ae6e" + integrity sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw== + dependencies: + node-int64 "^0.4.0" + opentracing "^0.14.4" + thriftrw "^3.5.0" + uuid "^8.3.2" + xorshift "^1.1.1" + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== + dependencies: + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-diff@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" + integrity sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.4.3" + +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + dependencies: + "@jest/types" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + +"jest-environment-jsdom24@npm:jest-environment-jsdom@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +"jest-environment-jsdom25@npm:jest-environment-jsdom@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" + integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" + jsdom "^15.2.1" + +"jest-environment-jsdom26@npm:jest-environment-jsdom@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +"jest-environment-jsdom27@npm:jest-environment-jsdom@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +"jest-environment-jsdom28@npm:jest-environment-jsdom@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" + integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/jsdom" "^16.2.4" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + jsdom "^19.0.0" + +"jest-environment-jsdom29@npm:jest-environment-jsdom@^29.0.1": + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.4.3.tgz#bd8ed3808e6d3f616403fbaf8354f77019613d90" + integrity sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.4.3" + jest-util "^29.4.3" + jsdom "^20.0.0" + +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +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@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== + dependencies: + "@jest/types" "^28.1.3" + "@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 "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz#ea68ebc0568aebea4c4213b99f169ff786df96a0" + integrity sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg== + dependencies: + chalk "^4.0.0" + jest-diff "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.4.3" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-message-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" + integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^25.5.0" + "@types/stack-utils" "^1.0.1" + chalk "^3.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + slash "^3.0.0" + stack-utils "^1.0.1" + +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.3.tgz#65b5280c0fdc9419503b49d4f48d4999d481cb5b" + integrity sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.4.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-mock@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" + integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA== + dependencies: + "@jest/types" "^25.5.0" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + +jest-mock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.3.tgz#23d84a20a74cdfff0510fdbeefb841ed57b0fe7e" + integrity sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg== + dependencies: + "@jest/types" "^29.4.3" + "@types/node" "*" + jest-util "^29.4.3" + +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@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" + +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" + integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== + dependencies: + "@jest/types" "^25.5.0" + chalk "^3.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + make-dir "^3.0.0" + +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" + integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== + dependencies: + "@jest/types" "^29.4.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== + dependencies: + "@jest/types" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" + +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.1, jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== + dependencies: + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" + import-local "^3.0.2" + jest-cli "^28.1.3" + +joi@^17.3.0: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"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@4.1.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" + +js-yaml@^3.10.0, 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" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== + dependencies: + abab "^2.0.0" + acorn "^7.1.0" + acorn-globals "^4.3.2" + array-equal "^1.0.0" + cssom "^0.4.1" + cssstyle "^2.0.0" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.1" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.2.0" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.7" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^7.0.0" + xml-name-validator "^3.0.0" + +jsdom@^16.4.0, jsdom@^16.5.3, jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsdom@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== + dependencies: + abab "^2.0.5" + acorn "^8.5.0" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.1" + decimal.js "^10.3.1" + 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.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" + +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-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +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@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +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== + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +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.1, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.2.0, jsonc-parser@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kareem@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" + integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +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== + +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +kruptein@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/kruptein/-/kruptein-3.0.6.tgz#9cf976225af4bc1fbeba069dbb24f17eebad974d" + integrity sha512-EQJjTwAJfQkC4NfdQdo3HXM2a9pmBm8oidzH270cYu1MbgXPNPMJuldN7OPX+qdhPO5rw4X3/iKz0BFBfkXGKA== + dependencies: + asn1.js "^5.4.1" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +ky-universal@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.10.1.tgz#778881e098f6e3c52a87b382d9acca54d22bb0d3" + integrity sha512-r8909k+ELKZAxhVA5c440x22hqw5XcMRwLRbgpPQk4JHy3/ddJnvzcnSo5Ww3HdKdNeS3Y8dBgcIYyVahMa46g== + dependencies: + abort-controller "^3.0.0" + node-fetch "^3.2.2" + +ky@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/ky/-/ky-0.30.0.tgz#a3d293e4f6c4604a9a4694eceb6ce30e73d27d64" + integrity sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog== + +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" + +lazy-ass@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +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" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + +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== + +lines-and-columns@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + +lint-staged@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.1.2.tgz#443636a0cfd834d5518d57d228130dc04c83d6fb" + integrity sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.19" + commander "^9.4.1" + debug "^4.3.4" + execa "^6.1.0" + lilconfig "2.0.6" + listr2 "^5.0.5" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.2" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.1.3" + +listr2@^5.0.5: + version "5.0.7" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.7.tgz#de69ccc4caf6bea7da03c74f7a2ffecf3904bd53" + integrity sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw== + 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" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.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.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.curry@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +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, 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.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: + 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" + +lolex@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" + +long-timeout@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" + integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== + +long@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" + integrity sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.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" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +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@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + +luxon@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.3.tgz#8ddf0358a9492267ffec6a13675fbaab5551315d" + integrity sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg== + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +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== + +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-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +markdown-extensions@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" + integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +match-sorter@^6.0.2, match-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" + integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== + dependencies: + "@babel/runtime" "^7.12.5" + remove-accents "0.4.2" + +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== + dependencies: + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + +mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" + integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + dependencies: + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" + +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" + +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdx-expression@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdx-jsx@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.2.tgz#694a46164db10c0e9d674a3772b8748dfddd0817" + integrity sha512-o9vBCYQK5ZLGEj3tCGISJGjvafyHRVJlZmfJzSE7xjiogSzIeph/Z4zMY65q4WGRMezQBeAwPlrdymDYYYx0tA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + mdast-util-from-markdown "^1.1.0" + mdast-util-to-markdown "^1.3.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^4.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +mdast-util-mdx@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" + integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdx-jsx "^2.0.0" + mdast-util-mdxjs-esm "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdxjs-esm@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz#db859050d79d48cf9896d294de06f3ede7474d16" + integrity sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA== + dependencies: + "@types/mdast" "^3.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +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== + +methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" + integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" + integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-footnote@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" + integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" + integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-table@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" + integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" + integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" + integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" + integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-extension-mdx-expression@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.4.tgz#33fe2c6ee214738255de175a084281c11894ddda" + integrity sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw== + dependencies: + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-mdx-jsx@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz#9f196be5f65eb09d2a49b237a7b3398bba2999be" + integrity sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA== + dependencies: + "@types/acorn" "^4.0.0" + estree-util-is-identifier-name "^2.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdx-md@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz#382f5df9ee3706dd120b51782a211f31f4760d22" + integrity sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-mdxjs-esm@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz#630d9dc9db2c2fd470cac8c1e7a824851267404d" + integrity sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.1.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdxjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz#772644e12fc8299a33e50f59c5aa15727f6689dd" + integrity sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^1.0.0" + micromark-extension-mdx-jsx "^1.0.0" + micromark-extension-mdx-md "^1.0.0" + micromark-extension-mdxjs-esm "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-destination@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" + integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" + integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-mdx-expression@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.7.tgz#e38298dc1f7eaf6ba1d9f210531ceae17155c00f" + integrity sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-factory-space@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" + integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" + integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-whitespace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" + integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" + integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" + integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" + integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" + integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" + integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" + integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" + integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== + +micromark-util-events-to-acorn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.1.tgz#d5b9dfbc589ece7917de24de0a57b909c0d36583" + integrity sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + estree-util-visit "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-location "^4.0.0" + vfile-message "^3.0.0" + +micromark-util-html-tag-name@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" + integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== + +micromark-util-normalize-identifier@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" + integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" + integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" + integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" + integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" + integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" + integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== + +micromark@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" + integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, 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" + +microseconds@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" + integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== + +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-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, 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" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +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== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +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@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + +mitt@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + +monaco-editor@^0.31.1: + version "0.31.1" + resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.31.1.tgz#67f597b3e45679d1f551237e12a3a42c4438b97b" + integrity sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q== + +mongodb-connection-string-url@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" + integrity sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== + dependencies: + "@types/whatwg-url" "^8.2.1" + whatwg-url "^11.0.0" + +mongodb@4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.17.1.tgz#ccff6ddbda106d5e06c25b0e4df454fd36c5f819" + integrity sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ== + dependencies: + bson "^4.7.2" + mongodb-connection-string-url "^2.6.0" + socks "^2.7.1" + optionalDependencies: + "@aws-sdk/credential-providers" "^3.186.0" + "@mongodb-js/saslprep" "^1.1.0" + +mongoose@^6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.12.0.tgz#53035998245a029144411331373c5ce878f62815" + integrity sha512-sd/q83C6TBRPBrrD2A/POSbA/exbCFM2WOuY7Lf2JuIJFlHFG39zYSDTTAEiYlzIfahNOLmXPxBGFxdAch41Mw== + dependencies: + bson "^4.7.2" + kareem "2.5.1" + mongodb "4.17.1" + mpath "0.9.0" + mquery "4.0.3" + ms "2.1.3" + sift "16.0.1" + +mpath@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" + integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== + +mquery@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" + integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== + dependencies: + debug "4.x" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +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.1.3, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nan@^2.12.1: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nano-css@^5.3.1: + version "5.3.5" + resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.3.5.tgz#3075ea29ffdeb0c7cb6d25edb21d8f7fa8e8fe8e" + integrity sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg== + dependencies: + css-tree "^1.1.2" + csstype "^3.0.6" + fastest-stable-stringify "^2.0.2" + inline-style-prefixer "^6.0.0" + rtl-css-js "^1.14.0" + sourcemap-codec "^1.4.8" + stacktrace-js "^2.0.2" + stylis "^4.0.6" + +nano-time@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" + integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== + dependencies: + big-integer "^1.6.16" + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +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: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nest-winston@^1.9.2: + version "1.9.3" + resolved "https://registry.yarnpkg.com/nest-winston/-/nest-winston-1.9.3.tgz#5008a415036e03ab0a02495f196ca982fffa09fe" + integrity sha512-BLDGvbKCeliQNNrNjFRKSbO9hu/a39YL3y+4aU0eTGHh5TgzNMqx5ZscbecKR0fM3/KumMznZdEWmAJBINHl6Q== + dependencies: + fast-safe-stringify "^2.1.1" + +next-query-params@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/next-query-params/-/next-query-params-4.1.0.tgz#d69e0cb3f0ec1e746a7bb255cd5a07d9e03ba95d" + integrity sha512-jjoQByM9s2d4wCUBUazhgHNVztm18meCtVoDj6v45+LZIQfxAF5QYVFKCbDYarI3iXD4xcZprztqLtALiiV8nQ== + dependencies: + tslib "^2.0.3" + +next-seo@^4.28.1: + version "4.29.0" + resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-4.29.0.tgz#d281e95ba47914117cc99e9e468599f0547d9b9b" + integrity sha512-xmwzcz4uHaYJ8glbuhs6FSBQ7z3irmdPYdJJ5saWm72Uy3o+mPKGaPCXQetTCE6/xxVnpoDV4yFtFlEjUcljSg== + +next-seo@^5.5.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.15.0.tgz#b1a90508599774982909ea44803323c6fb7b50f4" + integrity sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg== + +next-themes@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" + integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== + +next@^12.3.4: + version "12.3.4" + resolved "https://registry.yarnpkg.com/next/-/next-12.3.4.tgz#f2780a6ebbf367e071ce67e24bd8a6e05de2fcb1" + integrity sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ== + dependencies: + "@next/env" "12.3.4" + "@swc/helpers" "0.4.11" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.0.7" + use-sync-external-store "1.2.0" + optionalDependencies: + "@next/swc-android-arm-eabi" "12.3.4" + "@next/swc-android-arm64" "12.3.4" + "@next/swc-darwin-arm64" "12.3.4" + "@next/swc-darwin-x64" "12.3.4" + "@next/swc-freebsd-x64" "12.3.4" + "@next/swc-linux-arm-gnueabihf" "12.3.4" + "@next/swc-linux-arm64-gnu" "12.3.4" + "@next/swc-linux-arm64-musl" "12.3.4" + "@next/swc-linux-x64-gnu" "12.3.4" + "@next/swc-linux-x64-musl" "12.3.4" + "@next/swc-win32-arm64-msvc" "12.3.4" + "@next/swc-win32-ia32-msvc" "12.3.4" + "@next/swc-win32-x64-msvc" "12.3.4" + +nextra-theme-docs@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.0.2.tgz#a83656ca6e7177f8879ceff93ac80922e4708857" + integrity sha512-EE6P5JyF26tb9YGueYMpZh5KRfMLuB/5FIti8gyhvbVqgU1OBO14Ex2xOIAvLB5Lqsg1eSv3mg84T7lwOg9E8w== + dependencies: + "@headlessui/react" "^1.6.6" + "@mdx-js/react" "^2.1.5" + "@popperjs/core" "^2.11.6" + clsx "^1.2.1" + flexsearch "^0.7.21" + focus-visible "^5.2.0" + git-url-parse "^13.1.0" + github-slugger "^2.0.0" + intersection-observer "^0.12.2" + match-sorter "^6.3.1" + next-seo "^5.5.0" + next-themes "^0.2.1" + scroll-into-view-if-needed "^3.0.0" + +nextra@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.0.1.tgz#f761b894dac2a9587be41945a6de2f44a29ee950" + integrity sha512-IOBwqMREnadxGryNHvwr3sZuD90uyaTxCWi9yxDB56UndsLBTulKwXNIOdW1FV+vKTbSGpz89wNe665Moli7Kw== + dependencies: + "@mdx-js/mdx" "^2.1.3" + "@napi-rs/simple-git" "^0.1.8" + github-slugger "^1.4.0" + graceful-fs "^4.2.10" + gray-matter "^4.0.3" + rehype-mdx-title "^1.0.0" + rehype-pretty-code "0.2.4" + remark-gfm "^3.0.1" + remark-reading-time "^2.0.1" + shiki "0.10.1" + slash "^3.0.0" + title "^3.5.3" + unist-util-visit "^4.1.1" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +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@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.0.tgz#37e71db4ecc257057af828d523a7243d651d91e4" + integrity sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + +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-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +node-schedule@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" + integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ== + dependencies: + cron-parser "^4.2.0" + long-timeout "0.1.1" + sorted-array-functions "^1.3.0" + +nodemon@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" + integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^5.7.1" + simple-update-notifier "^1.0.7" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, 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== + +normalize-url@4: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.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.0.7, nwsapi@^2.2.0, nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +nx@16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.8.1.tgz#b3b084da5f880c638debbefbf33eeccb96633595" + integrity sha512-K5KrwNdPz0eEe6SY5wrnhZcigjfIJkttPrIJRXNBQTE50NGcOfz1TjMXPdTWBxBCCua5PAealO3OrE8jpv+QnQ== + dependencies: + "@nrwl/tao" "16.8.1" + "@parcel/watcher" "2.0.4" + "@yarnpkg/lockfile" "^1.1.0" + "@yarnpkg/parsers" "3.0.0-rc.46" + "@zkochan/js-yaml" "0.0.6" + axios "^1.0.0" + chalk "^4.1.0" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^7.0.2" + dotenv "~16.3.1" + dotenv-expand "~10.0.0" + enquirer "~2.3.6" + fast-glob "3.2.7" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^11.1.0" + glob "7.1.4" + ignore "^5.0.4" + js-yaml "4.1.0" + jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" + minimatch "3.0.5" + node-machine-id "1.1.12" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.5.3" + string-width "^4.2.3" + strong-log-transformer "^2.1.0" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^4.1.2" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nx/nx-darwin-arm64" "16.8.1" + "@nx/nx-darwin-x64" "16.8.1" + "@nx/nx-freebsd-x64" "16.8.1" + "@nx/nx-linux-arm-gnueabihf" "16.8.1" + "@nx/nx-linux-arm64-gnu" "16.8.1" + "@nx/nx-linux-arm64-musl" "16.8.1" + "@nx/nx-linux-x64-gnu" "16.8.1" + "@nx/nx-linux-x64-musl" "16.8.1" + "@nx/nx-win32-arm64-msvc" "16.8.1" + "@nx/nx-win32-x64-msvc" "16.8.1" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.0, 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-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.2, 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-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.3, 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.getownpropertydescriptors@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + 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.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +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" + +oblivious-set@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" + integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@^1.0.2, 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, once@^1.3.1, once@^1.4.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@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opentracing@^0.14.4: + version "0.14.7" + resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.7.tgz#25d472bd0296dc0b64d7b94cbc995219031428f5" + integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +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-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.0.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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.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-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + dependencies: + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.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" + +parse-numeric-range@^1.2.0, parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse-path@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" + integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== + dependencies: + protocols "^2.0.0" + +parse-url@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== + dependencies: + parse-path "^7.0.0" + +parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parse5@6.0.1, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +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" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +passport-local-mongoose@^6.1.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/passport-local-mongoose/-/passport-local-mongoose-6.3.0.tgz#866d6c7807636d2cb0519e693b0a3831b11f0e1a" + integrity sha512-SL1OJc59tk3h36cqQ7ekGTULvkFvC/YYRrp5dQfSSZDM5Y/dDSg4zRX5TcJqPya1eKVisbUgmusWIAWhJpIFWQ== + dependencies: + generaterr "^1.5.0" + passport-local "^1.0.0" + scmp "^2.1.0" + +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + integrity sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow== + dependencies: + passport-strategy "1.x.x" + +passport-strategy@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== + +passport@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.5.3.tgz#e69b46c9bb3290660bc2b3299330d78710b198cc" + integrity sha512-gGc+70h4gGdBWNsR3FuV3byLDY6KBTJAIExGFXTpQaYfbbcHCBlRRKx7RBQSpqEqc5Hh2qVzRs7ssvSfOpkUEA== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +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-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +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.6.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@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +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@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-protocol@*: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +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.1, 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== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pino-abstract-transport@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" + integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +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" + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +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" + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +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== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^27.0.2, pretty-format@^27.5.1: + 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@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" + integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prismjs@^1.23.0, prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +process@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" + integrity sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +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-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, 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" + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" + integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + +protobufjs@^7.0.0, protobufjs@^7.2.3: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +protobufjs@~6.11.2: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protocols@^2.0.0, protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.28, psl@^1.1.33, psl@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@2.x.x, 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== + +qs@6.11.0, qs@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +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== + +ramda@0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rate-limit-redis@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rate-limit-redis/-/rate-limit-redis-3.0.2.tgz#0c923db4ab77960ef1c5c495f14c08e6fad602de" + integrity sha512-4SBK6AzIr9PKkCF4HmSDcJH2O2KKMF3fZEcsbNMXyaL5I9d6X71uOreUldFRiyrRyP+qkQrTxzJ38ZKKN+sScw== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-base16-styling@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.9.1.tgz#4906b4c0a51636f2dca2cea8b682175aa8bd0c92" + integrity sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw== + dependencies: + "@babel/runtime" "^7.16.7" + "@types/base16" "^1.0.2" + "@types/lodash" "^4.14.178" + base16 "^1.0.0" + color "^3.2.1" + csstype "^3.0.10" + lodash.curry "^4.1.1" + +react-bootstrap-range-slider@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/react-bootstrap-range-slider/-/react-bootstrap-range-slider-3.0.8.tgz#5efc36314dc02195914b3dbdaed00da41af83682" + integrity sha512-FpDd1J1BW23jNN3fXmpy5nNDJ3PwMZ2/0dNse9RORwQ/z2rmpMQp/g6iNRpW6SjQkLKyGeNHyctK6dP+3zUXQA== + dependencies: + classnames "^2.3.1" + prop-types "^15.7.2" + +react-bootstrap@^2.4.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.2.tgz#100069ea7b4807cccbc5fef1e33bc90283262602" + integrity sha512-WDSln+mG4RLLFO01stkj2bEx/3MF4YihK9D/dWnHaSxOiQZLbhhlf95D2Jb20X3t2m7vMxRe888FVrfLJoGmmA== + dependencies: + "@babel/runtime" "^7.17.2" + "@restart/hooks" "^0.4.6" + "@restart/ui" "^1.4.1" + "@types/react-transition-group" "^4.4.4" + classnames "^2.3.1" + dom-helpers "^5.2.1" + invariant "^2.2.4" + prop-types "^15.8.1" + prop-types-extra "^1.1.0" + react-transition-group "^4.4.2" + uncontrollable "^7.2.1" + warning "^4.0.3" + +react-copy-to-clipboard@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz#09aae5ec4c62750ccb2e6421a58725eabc41255c" + integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== + dependencies: + copy-to-clipboard "^3.3.1" + prop-types "^15.8.1" + +react-csv@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/react-csv/-/react-csv-2.2.2.tgz#5bbf0d72a846412221a14880f294da9d6def9bfb" + integrity sha512-RG5hOcZKZFigIGE8LxIEV/OgS1vigFQT4EkaHeKgyuCbUAu9Nbd/1RYq++bJcJJ9VOqO/n9TZRADsXNDR4VEpw== + +react-datepicker@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.10.0.tgz#3f386ac5873dac5ea56544e51cdc01109938796c" + integrity sha512-6IfBCZyWj54ZZGLmEZJ9c4Yph0s9MVfEGDC2evOvf9AmVz+RRcfP2Czqad88Ff9wREbcbqa4dk7IFYeXF1d3Ag== + dependencies: + "@popperjs/core" "^2.9.2" + classnames "^2.2.6" + date-fns "^2.24.0" + prop-types "^15.7.2" + react-onclickoutside "^6.12.2" + react-popper "^2.3.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-draggable@^4.0.0, react-draggable@^4.0.3: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.5.tgz#9e37fe7ce1a4cf843030f521a0a4cc41886d7e7c" + integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + +react-error-boundary@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" + integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== + dependencies: + "@babel/runtime" "^7.12.5" + +react-fast-compare@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-fast-marquee@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/react-fast-marquee/-/react-fast-marquee-1.3.5.tgz#e53995027102fbec92da90606d7ca89703db9903" + integrity sha512-eOqLoz4iVVBvi2wN/web8hd2XX9y2Z6CYR7g++7nTVHlTOXBtqyARQJ9rYNpbp179hAzloMx0yBFAo8LpNYmKQ== + +react-grid-layout@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-1.3.4.tgz#4fa819be24a1ba9268aa11b82d63afc4762a32ff" + integrity sha512-sB3rNhorW77HUdOjB4JkelZTdJGQKuXLl3gNg+BI8gJkTScspL1myfZzW/EM0dLEn+1eH+xW+wNqk0oIM9o7cw== + dependencies: + clsx "^1.1.1" + lodash.isequal "^4.0.0" + prop-types "^15.8.1" + react-draggable "^4.0.0" + react-resizable "^3.0.4" + +react-hook-form@^7.43.8: + version "7.43.8" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.43.8.tgz#189fe4fb31e15c280b529cc3041249ed12108d75" + integrity sha512-BQm+Ge5KjTk1EchDBRhdP8Pkb7MArO2jFF+UWYr3rtvh6197khi22uloLqlWeuY02ItlCzPunPsFt1/q9wQKnw== + +react-hotkeys-hook@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/react-hotkeys-hook/-/react-hotkeys-hook-4.3.7.tgz#87d4c2c939d190643acb66de84cdf586a8743dce" + integrity sha512-qUcA5vl/liGWr9wLYI5/8oppHLa6nExFqOAMC6CyZhpj7C56PIzYZ76xAtJ+5lgxObgl4A4pQz8upy+nq7orSQ== + +react-intersection-observer@^9.3.4: + version "9.4.3" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz#ec84ce0c25cad548075130ea045ac5c7adf908f3" + integrity sha512-WNRqMQvKpupr6MzecAQI0Pj0+JQong307knLP4g/nBex7kYfIaZsPpXaIhKHR+oV8z+goUbH9e10j6lGRnTzlQ== + +react-is@^16.10.2, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: + 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-json-tree@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.17.0.tgz#aca02cb8c2d3d944e128763c5d814bafa92511d4" + integrity sha512-hcWjibI/fAvsKnfYk+lka5OrE1Lvb1jH5pSnFhIU5T8cCCxB85r6h/NOzDPggSSgErjmx4rl3+2EkeclIKBOhg== + dependencies: + "@babel/runtime" "^7.18.3" + "@types/lodash" "^4.14.182" + "@types/prop-types" "^15.7.5" + prop-types "^15.8.1" + react-base16-styling "^0.9.1" + +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-markdown@^8.0.4: + version "8.0.5" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.5.tgz#c9a70a33ca9aeeafb769c6582e7e38843b9d70ad" + integrity sha512-jGJolWWmOWAvzf+xMdB9zwStViODyyFQhNB/bwCerbBKmrTmgmA599CGiOlP58OId1IMoIRsA8UdI1Lod4zb5A== + dependencies: + "@types/hast" "^2.0.0" + "@types/prop-types" "^15.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^2.0.0" + prop-types "^15.0.0" + property-information "^6.0.0" + react-is "^18.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + +react-measure@^2.0.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/react-measure/-/react-measure-2.5.2.tgz#4ffc410e8b9cb836d9455a9ff18fc1f0fca67f89" + integrity sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA== + dependencies: + "@babel/runtime" "^7.2.0" + get-node-dimensions "^1.2.1" + prop-types "^15.6.2" + resize-observer-polyfill "^1.5.0" + +react-merge-refs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-2.0.1.tgz#a1f8c2dadefa635333e9b91ec59f30b65228b006" + integrity sha512-pywF6oouJWuqL26xV3OruRSIqai31R9SdJX/I3gP2q8jLxUnA1IwXcLW8werUHLZOrp4N7YOeQNZrh/BKrHI4A== + +react-modal@^3.14.3: + version "3.16.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" + integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== + dependencies: + exenv "^1.2.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + +react-modern-drawer@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-modern-drawer/-/react-modern-drawer-1.2.0.tgz#1604acab03facac03945fc3cfc61e59d535ca6e8" + integrity sha512-GBQaeDNpnt6GFm3U9y/wzkZerP6R92CrgC9ge3/PHCm0F0LdUzt7rjFSwdd47Pdy6+FhXKR2rn7VxW3pl/+m9w== + +react-onclickoutside@^6.12.2: + version "6.12.2" + resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz#8e6cf80c7d17a79f2c908399918158a7b02dda01" + integrity sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA== + +react-popper@^2.2.5, react-popper@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" + +react-query@^3.39.1: + version "3.39.3" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" + integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== + dependencies: + "@babel/runtime" "^7.5.5" + broadcast-channel "^3.4.1" + match-sorter "^6.0.2" + +react-reflex@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/react-reflex/-/react-reflex-4.0.9.tgz#3f20d0afacb43f5f37b93e0b56f5042b63b54d06" + integrity sha512-XFTNRekFK4ul8mzVd1lniKT/SI0FvNYhXyLNl5gagS1i3iW9QKlpFYcRfVhZlxxaYHb8UyLOs3+H4Ay5cjtbxQ== + dependencies: + "@babel/runtime" "^7.0.0" + lodash.throttle "^4.1.1" + prop-types "^15.5.8" + react-measure "^2.0.2" + +react-resizable@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-3.0.5.tgz#362721f2efbd094976f1780ae13f1ad7739786c1" + integrity sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w== + dependencies: + prop-types "15.x" + react-draggable "^4.0.3" + +react-resize-detector@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-8.0.4.tgz#385a68287282ec7835758570f8e74980aa9d234d" + integrity sha512-ln9pMAob8y8mc9UI4aZuuWFiyMqBjnTs/sxe9Vs9dPXUjwCTeKK1FP8I75ufnb/2mEEZXG6wOo/fjMcBRRuAXw== + dependencies: + lodash "^4.17.21" + +react-select@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" + integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.1.2" + +react-slider@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-2.0.4.tgz#21c656ffabc3bb4481cf6b49e6d647baeda83572" + integrity sha512-sWwQD01n6v+MbeLCYthJGZPc0kzOyhQHyd0bSo0edg+IAxTVQmj3Oy4SBK65eX6gNwS9meUn6Z5sIBUVmwAd9g== + dependencies: + prop-types "^15.8.1" + +react-sliding-pane@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/react-sliding-pane/-/react-sliding-pane-7.3.0.tgz#a6a03b90db216e7ec6f746c7e649d19ba03ff4e0" + integrity sha512-KCyxw2BBvXjwYm1UX83Vk67D4kxec2icJxrSPidNus8voh1yB1K6bluwShAe3OvN5zk8H9InL22jGomTUOOudw== + dependencies: + prop-types "^15.7.2" + react-modal "^3.14.3" + +react-smooth@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.2.tgz#0ef24213628cb13bf4305194a050e1db4302a3a1" + integrity sha512-pgqSp1q8rAGtF1bXQE0m3CHGLNfZZh5oA5o1tsPLXRHnKtkujMIJ8Ws5nO1mTySZf1c4vgwlEk+pHi3Ln6eYLw== + dependencies: + fast-equals "^4.0.3" + react-transition-group "2.9.0" + +react-sortable-hoc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz#f6780d8aa4b922a21f3e754af542f032677078b7" + integrity sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg== + dependencies: + "@babel/runtime" "^7.2.0" + invariant "^2.2.4" + prop-types "^15.5.7" + +react-syntax-highlighter@^15.4.5: + version "15.5.0" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react-table@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.8.0.tgz#07858c01c1718c09f7f1aed7034fcfd7bda907d2" + integrity sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA== + +react-toastify@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-8.2.0.tgz#ef7d56bdfdc6272ca6b228368ab564721c3a3244" + integrity sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg== + dependencies: + clsx "^1.1.1" + +react-transition-group@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== + dependencies: + dom-helpers "^3.4.0" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" + +react-transition-group@^4.3.0, react-transition-group@^4.4.2: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react-universal-interface@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" + integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== + +react-use@^17.4.0: + version "17.4.0" + resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.4.0.tgz#cefef258b0a6c534a5c8021c2528ac6e1a4cdc6d" + integrity sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q== + dependencies: + "@types/js-cookie" "^2.2.6" + "@xobotyi/scrollbar-width" "^1.9.5" + copy-to-clipboard "^3.3.1" + fast-deep-equal "^3.1.3" + fast-shallow-equal "^1.0.0" + js-cookie "^2.2.1" + nano-css "^5.3.1" + react-universal-interface "^0.6.2" + resize-observer-polyfill "^1.5.1" + screenfull "^5.1.0" + set-harmonic-interval "^1.0.1" + throttle-debounce "^3.0.1" + ts-easing "^0.2.0" + tslib "^2.1.0" + +react-useportal@^1.0.18: + version "1.0.18" + resolved "https://registry.yarnpkg.com/react-useportal/-/react-useportal-1.0.18.tgz#b3baf14962f44402b2d0d6152acc2035c5342bd8" + integrity sha512-dGuT/yyE2T9RtUxRZJYkIX8tLHC7KxAxbMw/Ufjiwo8ixoDYzkk9LFKGnARtCtFz6Yd5AoP7fVymrN3eT04jiA== + dependencies: + use-ssr "^1.0.25" + +react-virtual@^2.10.4: + version "2.10.4" + resolved "https://registry.yarnpkg.com/react-virtual/-/react-virtual-2.10.4.tgz#08712f0acd79d7d6f7c4726f05651a13b24d8704" + integrity sha512-Ir6+oPQZTVHfa6+JL9M7cvMILstFZH/H3jqeYeKI4MSUX+rIruVwFC6nGVXw9wqAw8L0Kg2KvfXxI85OvYQdpQ== + dependencies: + "@reach/observe-rect" "^1.1.0" + +react-virtualized-auto-sizer@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.7.tgz#bfb8414698ad1597912473de3e2e5f82180c1195" + integrity sha512-Mxi6lwOmjwIjC1X4gABXMJcKHsOo0xWl3E3ugOgufB8GJU+MqrtY35aBuvCYv/razQ1Vbp7h1gWJjGjoNN5pmA== + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468" + integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.5.0.tgz#34452852509099502690f9d2a72bde1d4cd65648" + integrity sha512-0EQYz3iA18r1Uq8VqGZ4dABW52AKBnio37kJgnztIqprELJXpOEsa0SzkqU1vjAhpCXCv52Dx1hiL9119xsqsQ== + dependencies: + classnames "^2.2.5" + eventemitter3 "^4.0.1" + lodash "^4.17.19" + react-is "^16.10.2" + react-resize-detector "^8.0.4" + react-smooth "^2.0.2" + recharts-scale "^0.4.4" + reduce-css-calc "^2.1.8" + victory-vendor "^36.6.8" + +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" + +redis@^4.6.8: + version "4.6.8" + resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.8.tgz#54c5992e8a5ba512506fe9f53142cadc405547e7" + integrity sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ== + dependencies: + "@redis/bloom" "1.2.0" + "@redis/client" "1.5.9" + "@redis/graph" "1.1.0" + "@redis/json" "1.0.4" + "@redis/search" "1.1.3" + "@redis/time-series" "1.0.5" + +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: + 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== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +rehype-mdx-title@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rehype-mdx-title/-/rehype-mdx-title-1.0.0.tgz#292598b5ad8af2c2bd01b3674caea1a44bb60f63" + integrity sha512-5B/53Y+KQHm4/nrE6pIIPc9Ie2fbPMCLs8WwMGYWWHr+5g3TkmEijRkr8TGYHULtc+C7bOoPR8LIF5DpGROIDg== + dependencies: + estree-util-is-identifier-name "^1.1.0" + hast-util-to-string "^1.0.4" + unist-util-visit "^2.0.3" + +rehype-pretty-code@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.2.4.tgz#73b1e1c3ca7f50aaeeb131185a744a5ea936a08f" + integrity sha512-vbqwIa4cNwRaVur9caUw/b0jOQR88Svrs9c9RaQoogvbBxs5X9bWrSe5oFypaRTTq2cpZ45YzJQ7UUPO76LMKA== + dependencies: + parse-numeric-range "^1.3.0" + +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" + +remark-mdx@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" + integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== + dependencies: + mdast-util-mdx "^2.0.0" + micromark-extension-mdxjs "^1.0.0" + +remark-parse@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" + integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" + +remark-prism@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/remark-prism/-/remark-prism-1.3.6.tgz#f733aaec1b9f37975ea730fca86c014dc9775cda" + integrity sha512-yYSXJ2MEK2DeD9UKDKFkQPcVqRx6aX2FYD1kE27ScogpZ/BBO8MoOO6gf/AKqfXvKGnP51wqvDEBmPseypgaug== + dependencies: + classnames "^2.3.1" + css-selector-parser "^1.4.1" + escape-html "^1.0.3" + jsdom "^16.5.3" + parse-numeric-range "^1.2.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + prismjs "^1.23.0" + unist-util-map "^2.0.1" + +remark-reading-time@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/remark-reading-time/-/remark-reading-time-2.0.1.tgz#fe8bb8e420db7678dc749385167adb4fc99318f7" + integrity sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw== + dependencies: + estree-util-is-identifier-name "^2.0.0" + estree-util-value-to-estree "^1.3.0" + reading-time "^1.3.0" + unist-util-visit "^3.1.0" + +remark-rehype@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" + +remove-accents@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" + integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5, request-promise-native@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +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-in-the-middle@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.1.0.tgz#8ab4089383e7b7879ed134d8e9d1887bd48195ec" + integrity sha512-6f86Mh0vWCxqKKatRPwgY6VzYmcVay3WUTIpJ1ILBCNh+dTWabMR1swKGKz3XcEZ5mgjndzRu7fQ+44G2H9Gew== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.22.1" + +require-in-the-middle@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.1.1.tgz#2000741f7894322ebd4b82fc783880d5b5052d36" + integrity sha512-OScOjQjrrjhAdFpQmnkE/qbIBGCRFhQB/YaJhcC3CPOlmhe7llnW46Ac1J5+EjcNXOTnDdpF96Erw/yedsGksQ== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.22.1" + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +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== + +resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +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-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.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" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +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, rimraf@^3.0.0, 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" + +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" + +rrdom@^2.0.0-alpha.8: + version "2.0.0-alpha.8" + resolved "https://registry.yarnpkg.com/rrdom/-/rrdom-2.0.0-alpha.8.tgz#d8561ca0b95cae8b8fe14ed29179ddd8fc18a60d" + integrity sha512-rUyeS9fSOO6uSxCdeY5bQkKQTPECIgxsOCb/WR7eA/UsVkVpdDOyCV43wxm92V2JOtqMuv+36rUpEDFW+YFjOw== + dependencies: + rrweb-snapshot "^2.0.0-alpha.8" + +rrweb-snapshot@^1.1.14: + version "1.1.14" + resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-1.1.14.tgz#9d4d9be54a28a893373428ee4393ec7e5bd83fcc" + integrity sha512-eP5pirNjP5+GewQfcOQY4uBiDnpqxNRc65yKPW0eSoU1XamDfc4M8oqpXGMyUyvLyxFDB0q0+DChuxxiU2FXBQ== + +rrweb-snapshot@^2.0.0-alpha.8: + version "2.0.0-alpha.8" + resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-2.0.0-alpha.8.tgz#5f93f8ab7d78b3de26f6a64e993ff68edd54e0cf" + integrity sha512-3Rb7c+mnDEADQ8N9qn9SDH5PzCyHlZ1cwZC932qRyt9O8kJWLM11JLYqqEyQCa2FZVQbzH2iAaCgnyM7A32p7A== + +rrweb@2.0.0-alpha.8: + version "2.0.0-alpha.8" + resolved "https://registry.yarnpkg.com/rrweb/-/rrweb-2.0.0-alpha.8.tgz#5cd21510fa011dcb21284a43f3f3d467e2985590" + integrity sha512-JtJCeUjZ91/qJ6gvLmZw/1Bxuddt06pD887shIYzGhKuOgjtvkUdhBtB5uXrV7Bvi3WELYGZr1stqBugWa9MXg== + dependencies: + "@rrweb/types" "^2.0.0-alpha.8" + "@types/css-font-loading-module" "0.0.7" + "@xstate/fsm" "^1.4.0" + base64-arraybuffer "^1.0.1" + fflate "^0.4.4" + mitt "^3.0.0" + rrdom "^2.0.0-alpha.8" + rrweb-snapshot "^2.0.0-alpha.8" + +rrweb@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/rrweb/-/rrweb-1.1.3.tgz#4fbb3d473d71c79b6c30a54e585e5a01c8ac08bb" + integrity sha512-F2qp8LteJLyycsv+lCVJqtVpery63L3U+/ogqMA0da8R7Jx57o6gT+HpjrzdeeGMIBZR7kKNaKyJwDupTTu5KA== + dependencies: + "@types/css-font-loading-module" "0.0.7" + "@xstate/fsm" "^1.4.0" + base64-arraybuffer "^1.0.1" + fflate "^0.4.4" + mitt "^1.1.3" + rrweb-snapshot "^1.1.14" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +rtl-css-js@^1.14.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" + integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== + dependencies: + "@babel/runtime" "^7.1.2" + +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.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +rxjs@^7.8.1: + 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" + +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +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.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, 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-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +safe-stable-stringify@^2.3.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz#ec7b037768098bf65310d1d64370de0dc02353aa" + integrity sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sass@^1.54.8: + version "1.58.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" + integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +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.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +scmp@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/scmp/-/scmp-2.1.0.tgz#37b8e197c425bdeb570ab91cc356b311a11f9c9a" + integrity sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q== + +screenfull@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" + integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== + +scroll-into-view-if-needed@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.6.tgz#2c803a509c1036bc4a9c009fecc5c145f87e47cf" + integrity sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA== + dependencies: + compute-scroll-into-view "^3.0.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +semver@7.x, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2: + version "7.5.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" + integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.5.1: + 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" + +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== + dependencies: + type-fest "^0.20.2" + +serialize-query-params@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/serialize-query-params/-/serialize-query-params-2.0.2.tgz#598a3fb9e13f4ea1c1992fbd20231aa16b31db81" + integrity sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q== + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-harmonic-interval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" + integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +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== + +shiki@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" + integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== + dependencies: + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "5.2.0" + +shimmer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + +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" + +sift@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" + integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== + +signal-exit@^3.0.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== + +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" + +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + +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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +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== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socks@^2.7.1: + 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" + +sorted-array-functions@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" + integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== + +"source-map-js@>=0.6.2 <2.0.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-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +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-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +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== + +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +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== + +sqlstring@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" + integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-generator@^2.0.5: + version "2.0.10" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" + integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== + dependencies: + stackframe "^1.3.4" + +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@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" + +stack-utils@^2.0.2, 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" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-gps@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== + dependencies: + source-map "0.5.6" + stackframe "^1.3.4" + +stacktrace-js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== + dependencies: + error-stack-parser "^2.0.6" + stack-generator "^2.0.5" + stacktrace-gps "^3.0.4" + +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + +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" + +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +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-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw== + +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: + 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.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" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +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.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +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-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +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.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== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + +strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + +style-to-object@^0.4.0, style-to-object@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" + integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== + dependencies: + inline-style-parser "0.1.1" + +styled-jsx@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.7.tgz#be44afc53771b983769ac654d355ca8d019dff48" + integrity sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA== + +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + +stylis@^4.0.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +superagent@^8.0.5: + version "8.0.9" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.9.tgz#2c6fda6fadb40516515f93e9098c0eb1602e0535" + integrity sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.4" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.1.2" + methods "^1.1.2" + mime "2.6.0" + qs "^6.11.0" + semver "^7.3.8" + +supertest@^6.3.1: + version "6.3.3" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.3.tgz#42f4da199fee656106fd422c094cf6c9578141db" + integrity sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== + dependencies: + methods "^1.1.2" + superagent "^8.0.5" + +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0, supports-color@^5.5.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@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.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-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.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== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +swr@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8" + integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw== + +symbol-tree@^3.2.2, 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== + +tar-stream@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.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== + +thriftrw@^3.5.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9" + integrity sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw== + dependencies: + bufrw "^1.3.0" + error "7.0.2" + long "^2.4.0" + +throttle-debounce@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" + integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== + +through@^2.3.4, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timestamp-nano@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/timestamp-nano/-/timestamp-nano-1.0.1.tgz#be6eb118719504fcc3c7c732d2c461d3dd87da63" + integrity sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA== + +title@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" + integrity sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q== + dependencies: + arg "1.0.0" + chalk "2.3.0" + clipboardy "1.2.2" + titleize "1.0.0" + +titleize@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" + integrity sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw== + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +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-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +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" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^4.0.0, tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +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== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +ts-easing@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" + integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== + +ts-jest@^28.0.5, ts-jest@^28.0.7: + version "28.0.8" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +ts-node@^10.8.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" + +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" + +tsconfig-paths@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz#4819f861eef82e6da52fb4af1e8c930a39ed979a" + integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + +tslib@^1.11.1, 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.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +"tslib@^2.4.1 || ^1.9.3": + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tslib@^2.5.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + +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" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +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-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +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@^3.7.2: + version "3.12.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.12.0.tgz#4ce26edc1ccc59fc171e495887ef391fe1f5280e" + integrity sha512-qj9wWsnFvVEMUDbESiilKeXeHL7FwwiFcogfhfyjmvT968RXSvnl23f1JOClTHYItsi7o501C/7qVllscUP3oA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +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@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +uid@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/uid/-/uid-2.0.2.tgz#4b5782abf0f2feeefc00fa88006b2b3b7af3e3b9" + integrity sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g== + dependencies: + "@lukeed/csprng" "^1.0.0" + +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" + +uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-is@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.0.tgz#37eed0617b76c114fd34d44c201aa96fd928b309" + integrity sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ== + +unist-util-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-map/-/unist-util-map-2.0.1.tgz#c3fca064486d3937c4dad8b39c64974faae7c7c4" + integrity sha512-VdNvk4BQUUU9Rgr8iUOvclHa/iN9O+6Dt66FKij8l9OVezGG37gGWCPU5KSax1R2degqXFvl3kWTkvzL79e9tQ== + dependencies: + "@types/mdast" "^3.0.0" + object-assign "^4.0.0" + +unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-remove-position@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit-parents@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" + integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" + integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^4.0.0" + +unist-util-visit@^4.0.0, unist-util-visit@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +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== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unload@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" + integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== + dependencies: + "@babel/runtime" "^7.6.2" + detect-node "^2.0.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.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" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +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" + +use-isomorphic-layout-effect@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-query-params@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/use-query-params/-/use-query-params-2.2.0.tgz#921aa5bf5be653260a763e06ad004e7a960807e5" + integrity sha512-MPBwXVZYzFeJEdjv0YgPNFsafUOM8WTpwBEZfNEMlyzbTsf2c+ZpOBkdM95/w4rxzk4eVO3E4DW7v33+VDbiQw== + dependencies: + serialize-query-params "^2.0.2" + +use-ssr@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/use-ssr/-/use-ssr-1.0.25.tgz#c7f54b59d6e52db26749b1d4115a650101a190bd" + integrity sha512-VYF8kJKI+X7+U4XgGoUER2BUl0vIr+8OhlIhyldgSGE0KHMoDRXPvWeHUUeUktq7ACEOVLzXGq1+QRxcvtwvyQ== + +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +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== + +util.promisify@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + +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-compile-cache@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +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-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@^1, 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== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-location@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== + dependencies: + "@types/unist" "^2.0.0" + vfile "^5.0.0" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +victory-vendor@^36.6.8: + version "36.6.8" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.8.tgz#5a1c555ca99a39fdb66a6c959c8426eb834893a2" + integrity sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + +vscode-oniguruma@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + +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.7, walker@^1.0.8, walker@~1.0.5: + 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" + +warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +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== + +web-vitals@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.3.2.tgz#83e8dbd0f8fba43c5fe2e601573e804afc771790" + integrity sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q== + +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@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +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@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +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@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +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@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +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" + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.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.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.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" + +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" + +winston@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.9.0.tgz#2bbdeb8167a75fac6d9a0c6d002890cd908016c2" + integrity sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ== + 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" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +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@^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" + +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@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.1: + 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" + +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.0.0, ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.11.0, ws@^8.2.3: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +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.1.1, 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== + +xorshift@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/xorshift/-/xorshift-1.2.0.tgz#30a4cdd8e9f8d09d959ed2a88c42a09c660e8148" + integrity sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g== + +xtend@^4.0.0, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +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@4.0.0, 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== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.1.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + +yargs-parser@21.1.1, 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.6.2: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + 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" + +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" + +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-express-middleware@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/zod-express-middleware/-/zod-express-middleware-1.4.0.tgz#6ee1e5854d6f339c3bd3d562ab523d281621bc56" + integrity sha512-C1pBbwbuotitG1L3I1cr9QD/nuepHAdZEUbVn7y1o2cJq0oaUuS7gTVGby1+DGHL4t2P4eEZKCX0QQDv6hEs3A== + +zod@^3.22.2: + version "3.22.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" + integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==