From 4de1e1634f3ccf8226d35f8b93537bd4d9c53ee5 Mon Sep 17 00:00:00 2001 From: Alexsander Falcucci Date: Tue, 13 Feb 2024 16:20:58 +0100 Subject: [PATCH 1/9] add pallas stake snapshots integration --- .../action.yml | 16 +- .../actions/prepare-distribution/action.yml | 2 +- .../actions/publish-npm-package/action.yml | 83 + .github/workflows/ci.yml | 395 +- .github/workflows/docs.yml | 186 - .github/workflows/manual-publish-npm.yml | 71 + .github/workflows/pre-release.yml | 38 + .github/workflows/release.yml | 36 + .../parse-wasm-headless-tests-results.sh | 20 + .../run-wasm-tests-browser-headless.py | 44 + .github/workflows/test-client.yml | 74 + .github/workflows/test-deploy-network.yml | 4 + .../workflows/test-docker-distribution.yml | 2 +- Cargo.lock | 1902 +- Cargo.toml | 5 +- Makefile | 2 +- README.md | 6 + demo/protocol-demo/Cargo.toml | 12 +- docs/runbook/README.md | 3 +- docs/runbook/era-markers/README.md | 21 +- docs/runbook/manual-publish-crates/README.md | 2 +- docs/runbook/manual-publish-npm/README.md | 25 + .../img/run-workflow-button.png | Bin 0 -> 77858 bytes .../img/run-workflow-form.png | Bin 0 -> 38764 bytes .../img/run-workflow-result.png | Bin 0 -> 49263 bytes docs/website/Makefile | 26 +- docs/website/blog/2022-09-14-sqlite-stores.md | 2 +- ...3-11-27-mithril-client-library-released.md | 2 +- ...-01-03-signer-service-new-configuration.md | 46 + ...-23-mithril-client-npm-package-released.md | 19 + ...-08-testing-sanchonet-network-available.md | 20 + docs/website/package-lock.json | 14455 ++++++++++++++++ docs/website/package.json | 13 +- .../nodes/mithril-aggregator.md | 13 +- .../nodes/mithril-client-library-wasm.md | 120 + .../nodes/mithril-client-library.md | 16 +- .../developer-docs/nodes/mithril-client.md | 21 +- .../root/manual/developer-docs/references.md | 3 +- .../getting-started/SPO-on-boarding-guide.md | 3 +- .../getting-started/bootstrap-cardano-node.md | 2 +- .../manual/getting-started/run-signer-node.md | 4 +- .../mithril/mithril-network/aggregator.md | 2 +- docs/website/root/networks-matrix.md | 23 +- .../nodes/mithril-aggregator.md | 13 +- .../nodes/mithril-client-library-wasm.md | 118 + .../nodes/mithril-client-library.md | 26 +- .../developer-docs/nodes/mithril-client.md | 21 +- .../manual/developer-docs/references.md | 2 +- .../getting-started/SPO-on-boarding-guide.md | 3 +- .../getting-started/bootstrap-cardano-node.md | 2 +- .../manual/getting-started/run-signer-node.md | 4 +- .../mithril/mithril-network/aggregator.md | 2 +- .../version-maintained/networks-matrix.md | 35 +- docs/website/yarn.lock | 9865 ----------- .../Cargo.toml | 8 +- .../src/main.rs | 3 +- examples/client-snapshot/Cargo.toml | 12 +- examples/client-snapshot/README.md | 1 + examples/client-snapshot/src/main.rs | 4 + flake.lock | 30 +- flake.nix | 4 +- mithril-aggregator/Cargo.toml | 47 +- mithril-aggregator/Dockerfile | 3 +- mithril-aggregator/Dockerfile.ci | 3 +- mithril-aggregator/Makefile | 2 +- .../artifact_builder/cardano_transactions.rs | 97 + .../src/artifact_builder/mod.rs | 2 + .../src/commands/era_command.rs | 22 +- .../src/commands/tools_command.rs | 2 +- mithril-aggregator/src/configuration.rs | 13 + .../database/cardano_transaction_migration.rs | 26 + mithril-aggregator/src/database/migration.rs | 20 +- mithril-aggregator/src/database/mod.rs | 2 + .../database/provider/cardano_transaction.rs | 647 + .../src/database/provider/certificate.rs | 7 +- .../src/database/provider/epoch_setting.rs | 10 +- .../src/database/provider/mod.rs | 2 + .../src/database/provider/open_message.rs | 158 +- .../src/database/provider/signed_entity.rs | 58 +- .../src/database/provider/signer.rs | 7 +- .../database/provider/signer_registration.rs | 12 +- .../src/database/provider/single_signature.rs | 8 +- .../src/database/provider/stake_pool.rs | 10 +- .../src/database/provider/test_helper.rs | 3 +- .../src/dependency_injection/builder.rs | 239 +- .../src/dependency_injection/containers.rs | 31 +- .../src/entities/open_message.rs | 20 + mithril-aggregator/src/event_store/event.rs | 4 +- .../artifact_routes/cardano_transaction.rs | 279 + .../mithril_stake_distribution.rs | 29 +- .../http_server/routes/artifact_routes/mod.rs | 30 + .../routes/artifact_routes/snapshot.rs | 29 +- .../src/http_server/routes/middlewares.rs | 11 +- .../src/http_server/routes/mod.rs | 18 + .../src/http_server/routes/proof_routes.rs | 232 + .../src/http_server/routes/router.rs | 6 +- .../src/http_server/routes/signer_routes.rs | 2 +- .../src/message_adapters/mod.rs | 12 + .../to_cardano_transaction_list_message.rs | 57 + .../to_cardano_transaction_message.rs | 50 + .../to_cardano_transactions_proof_message.rs | 106 + mithril-aggregator/src/runtime/runner.rs | 288 +- .../src/runtime/state_machine.rs | 36 +- mithril-aggregator/src/services/certifier.rs | 165 + .../src/services/epoch_service.rs | 2 +- mithril-aggregator/src/services/message.rs | 130 +- mithril-aggregator/src/services/mod.rs | 2 + mithril-aggregator/src/services/prover.rs | 192 + .../src/services/signed_entity.rs | 317 +- .../src/services/stake_distribution.rs | 2 +- mithril-aggregator/src/signer_registerer.rs | 5 +- .../src/store/pending_certificate_store.rs | 4 +- .../src/store/protocol_parameters_store.rs | 5 +- .../src/store/verification_key_store.rs | 8 +- .../src/tools/certificates_hash_migrator.rs | 8 +- .../src/tools/signer_importer.rs | 2 +- mithril-aggregator/tests/certificate_chain.rs | 2 +- .../tests/create_certificate.rs | 2 +- mithril-aggregator/tests/era_checker.rs | 2 +- .../tests/genesis_to_signing.rs | 2 +- .../tests/open_message_expiration.rs | 156 + .../tests/open_message_newer_exists.rs | 124 + .../test_extensions/aggregator_observer.rs | 3 + .../tests/test_extensions/runtime_tester.rs | 34 +- mithril-client-cli/Cargo.toml | 36 +- .../aggregator_client/certificate_client.rs | 168 - .../src/aggregator_client/http_client.rs | 312 - .../mithril_stake_distribution_client.rs | 135 - .../src/aggregator_client/mod.rs | 10 - .../src/aggregator_client/snapshot_client.rs | 125 - mithril-client-cli/src/client.rs | 145 - .../mithril_stake_distribution/download.rs | 95 +- .../mithril_stake_distribution/list.rs | 36 +- .../src/commands/snapshot/download.rs | 278 +- .../src/commands/snapshot/list.rs | 39 +- .../src/commands/snapshot/show.rs | 53 +- mithril-client-cli/src/configuration.rs | 122 + .../src/dependencies/builder.rs | 381 - mithril-client-cli/src/dependencies/mod.rs | 4 - mithril-client-cli/src/lib.rs | 96 +- mithril-client-cli/src/main.rs | 79 +- .../from_certificate_message_adapter.rs | 72 - ...from_mithril_stake_distribution_message.rs | 69 - .../message_adapters/from_snapshot_message.rs | 47 - .../src/message_adapters/mod.rs | 9 - .../to_snapshot_download_message.rs | 35 - .../services/mithril_stake_distribution.rs | 525 - mithril-client-cli/src/services/mock.rs | 53 - mithril-client-cli/src/services/mod.rs | 13 - mithril-client-cli/src/services/snapshot.rs | 847 - mithril-client-cli/src/utils/expander.rs | 92 + .../src/utils/feedback_receiver.rs | 100 + mithril-client-cli/src/utils/mod.rs | 10 +- .../src/utils/progress_reporter.rs | 120 +- mithril-client-cli/src/utils/snapshot.rs | 84 + mithril-client-cli/src/utils/stream_reader.rs | 35 - mithril-client-cli/src/utils/unpacker.rs | 150 +- mithril-client-wasm/.gitignore | 3 + mithril-client-wasm/.vsls.json | 7 + mithril-client-wasm/Cargo.toml | 35 + mithril-client-wasm/Makefile | 46 + mithril-client-wasm/README.md | 89 + mithril-client-wasm/npm/README.md | 95 + mithril-client-wasm/src/client_wasm.rs | 392 + mithril-client-wasm/src/lib.rs | 5 + mithril-client-wasm/www-test/.gitignore | 3 + mithril-client-wasm/www-test/README.md | 29 + mithril-client-wasm/www-test/bootstrap.js | 5 + mithril-client-wasm/www-test/index.html | 10 + mithril-client-wasm/www-test/index.js | 127 + .../www-test/package-lock.json | 4359 +++++ mithril-client-wasm/www-test/package.json | 19 + .../www-test/webpack.config.js | 16 + mithril-client-wasm/www/.gitignore | 2 + mithril-client-wasm/www/bootstrap.js | 5 + mithril-client-wasm/www/index.html | 15 + mithril-client-wasm/www/index.js | 74 + mithril-client-wasm/www/package-lock.json | 4319 +++++ mithril-client-wasm/www/package.json | 18 + mithril-client-wasm/www/webpack.config.js | 20 + mithril-client/.gitignore | 1 + mithril-client/Cargo.toml | 54 +- mithril-client/Makefile | 3 - mithril-client/README.md | 6 +- mithril-client/src/aggregator_client.rs | 215 +- .../src/cardano_transaction_proof_client.rs | 284 + mithril-client/src/certificate_client.rs | 12 +- mithril-client/src/client.rs | 35 +- mithril-client/src/feedback.rs | 18 +- mithril-client/src/lib.rs | 27 +- mithril-client/src/message.rs | 107 +- .../src/mithril_stake_distribution_client.rs | 10 +- mithril-client/src/snapshot_client.rs | 144 +- mithril-client/src/type_alias.rs | 19 + .../tests/cardano_transaction_proof.rs | 68 + mithril-client/tests/certificate_get_list.rs | 11 +- mithril-client/tests/extensions/fake.rs | 177 +- mithril-client/tests/extensions/mod.rs | 1 + .../tests/extensions/routes/certificate.rs | 44 + .../routes/mithril_stake_distribution.rs | 39 + mithril-client/tests/extensions/routes/mod.rs | 17 + .../tests/extensions/routes/proof.rs | 30 + .../tests/extensions/routes/snapshot.rs | 81 + .../tests/extensions/routes/statistics.rs | 21 + ...stake_distribution_list_get_show_verify.rs | 36 +- .../snapshot_list_get_show_download_verify.rs | 60 +- mithril-common/Cargo.toml | 77 +- mithril-common/Makefile | 21 +- .../src/cardano_transaction_parser.rs | 265 + .../certificate_retriever.rs | 4 +- .../certificate_chain/certificate_verifier.rs | 8 +- mithril-common/src/chain_observer/builder.rs | 95 + .../src/chain_observer/cli_observer.rs | 16 +- mithril-common/src/chain_observer/mod.rs | 19 +- mithril-common/src/chain_observer/model.rs | 39 + .../src/chain_observer/pallas_observer.rs | 364 +- .../src/crypto_helper/cardano/cold_key.rs | 5 +- .../src/crypto_helper/cardano/mod.rs | 10 +- mithril-common/src/crypto_helper/era.rs | 12 +- .../src/crypto_helper/merkle_tree.rs | 302 + mithril-common/src/crypto_helper/mod.rs | 13 +- .../src/crypto_helper/types/wrappers.rs | 8 +- .../src/digesters/immutable_file.rs | 127 +- .../src/entities/cardano_network.rs | 11 + .../src/entities/cardano_transaction.rs | 69 + .../cardano_transactions_commitment.rs | 69 + .../cardano_transactions_set_proof.rs | 132 + mithril-common/src/entities/certificate.rs | 4 +- mithril-common/src/entities/mod.rs | 6 + .../src/entities/protocol_message.rs | 5 + mithril-common/src/entities/signed_entity.rs | 23 +- .../src/entities/signed_entity_type.rs | 97 +- mithril-common/src/era/adapters/builder.rs | 2 +- mithril-common/src/lib.rs | 38 +- .../cardano_transaction_commitment.rs | 81 + .../cardano_transaction_commitment_list.rs | 86 + .../messages/cardano_transactions_proof.rs | 268 + mithril-common/src/messages/certificate.rs | 5 +- .../cardano_transactions_set_proof.rs | 21 + .../src/messages/message_parts/mod.rs | 2 + .../src/messages/message_parts/signer.rs | 2 +- .../messages/mithril_stake_distribution.rs | 2 +- mithril-common/src/messages/mod.rs | 10 + .../src/messages/register_signature.rs | 2 +- .../src/messages/register_signer.rs | 2 +- .../signable_builder/cardano_transactions.rs | 219 + mithril-common/src/signable_builder/mod.rs | 15 +- .../signable_builder_service.rs | 43 + mithril-common/src/test_utils/apispec.rs | 4 +- mithril-common/src/test_utils/fake_data.rs | 15 + mithril-common/src/test_utils/mod.rs | 2 + mithril-explorer/Makefile | 33 +- mithril-explorer/README.md | 8 +- mithril-explorer/next.config.js | 4 + mithril-explorer/package-lock.json | 7700 ++++++++ mithril-explorer/package.json | 29 +- mithril-explorer/src/aggregators-list.js | 1 + mithril-explorer/src/app/layout.js | 30 +- mithril-explorer/src/charts.js | 6 +- .../src/components/CertificateModal/index.js | 14 + .../src/components/VerifyCertificate/index.js | 168 + mithril-explorer/src/utils.js | 14 + mithril-explorer/yarn.lock | 4801 ----- .../assets/docker/Dockerfile.cardano | 3 +- .../docker-compose-aggregator-auth-p2p.yaml | 3 + .../docker-compose-aggregator-auth.yaml | 3 + .../docker-compose-aggregator-noauth-p2p.yaml | 3 + .../docker-compose-aggregator-noauth.yaml | 3 + ...ker-compose-signer-unverified-norelay.yaml | 1 + .../docker-compose-signer-unverified-p2p.yaml | 1 + .../docker-compose-signer-unverified.yaml | 1 + ...ocker-compose-signer-verified-norelay.yaml | 1 + .../docker-compose-signer-verified-p2p.yaml | 1 + .../docker-compose-signer-verified.yaml | 1 + mithril-infra/assets/infra.version | 2 +- mithril-infra/assets/tools/pool/_prelude.sh | 11 +- .../tools/pool/register-stake-address.sh | 7 +- .../assets/tools/pool/register-stake-pool.sh | 13 +- .../assets/tools/pool/renew-opcert.sh | 8 +- .../assets/tools/pool/retire-stake-pool.sh | 9 +- .../configuration/testing-sanchonet/era.addr | 1 + .../configuration/testing-sanchonet/era.vkey | 1 + .../testing-sanchonet/genesis.vkey | 1 + mithril-infra/mithril.aggregator.tf | 7 +- mithril-infra/mithril.bootstrap.tf | 32 - mithril-infra/mithril.signer.tf | 23 +- mithril-infra/variables.tf | 22 +- mithril-persistence/.gitignore | 2 + mithril-persistence/Cargo.toml | 35 + mithril-persistence/Makefile | 19 + mithril-persistence/README.md | 5 + .../src/database/db_version.rs | 10 +- .../src/database/mod.rs | 2 + .../src/database/signed_entity_hydrator.rs | 56 + .../src/database/version_checker.rs | 6 +- mithril-persistence/src/lib.rs | 7 + .../src/sqlite/condition.rs | 3 +- .../src/sqlite/cursor.rs | 3 +- .../src/sqlite/entity.rs | 0 .../src/sqlite/mod.rs | 3 +- .../src/sqlite/projection.rs | 0 .../src/sqlite/provider.rs | 6 +- .../src/sqlite/source_alias.rs | 2 +- .../src/store/adapter/dumb_adapter.rs | 0 .../src/store/adapter/fail_adapter.rs | 0 .../src/store/adapter/memory_adapter.rs | 0 .../src/store/adapter/mod.rs | 0 .../src/store/adapter/sqlite_adapter.rs | 0 .../src/store/adapter/store_adapter.rs | 2 +- .../src/store/mod.rs | 0 .../src/store/stake_store.rs | 7 +- .../src/store/store_pruner.rs | 3 +- mithril-relay/Cargo.toml | 24 +- mithril-signer/Cargo.toml | 31 +- mithril-signer/Dockerfile | 3 +- mithril-signer/Dockerfile.ci | 3 +- mithril-signer/Makefile | 2 +- mithril-signer/src/configuration.rs | 34 +- .../database/cardano_transaction_migration.rs | 26 + mithril-signer/src/database/migration.rs | 2 +- mithril-signer/src/database/mod.rs | 2 + .../database/provider/cardano_transaction.rs | 504 + mithril-signer/src/database/provider/mod.rs | 5 + mithril-signer/src/lib.rs | 4 + .../src/protocol_initializer_store.rs | 11 +- mithril-signer/src/runtime/runner.rs | 48 +- mithril-signer/src/runtime/signer_services.rs | 86 +- .../test_extensions/state_machine_tester.rs | 64 +- mithril-stm/Cargo.toml | 2 +- mithril-stm/src/merkle_tree.rs | 6 +- .../mithril-aggregator-fake/.gitignore | 1 + .../mithril-aggregator-fake/Cargo.toml | 33 + .../mithril-aggregator-fake/README.md | 61 + .../mithril-aggregator-fake/scripts/import.sh | 106 + .../src/application.rs | 405 + .../src/default_values.rs | 552 + .../mithril-aggregator-fake/src/error.rs | 49 + .../mithril-aggregator-fake/src/handlers.rs | 231 + .../mithril-aggregator-fake/src/main.rs | 81 + .../src/shared_state.rs | 237 + mithril-test-lab/mithril-devnet/.gitignore | 2 +- mithril-test-lab/mithril-devnet/README.md | 20 +- mithril-test-lab/mithril-devnet/VERSION | 1 + .../babbage/alonzo-babbage-test-genesis.json | 371 + .../babbage/conway-babbage-test-genesis.json | 37 + .../byron}/configuration.yaml | 68 +- mithril-test-lab/mithril-devnet/devnet-log.sh | 6 +- .../mithril-devnet/devnet-mkfiles.sh | 1438 +- .../mithril-devnet/devnet-query.sh | 6 +- mithril-test-lab/mithril-devnet/devnet-run.sh | 35 +- .../mithril-devnet/devnet-stop.sh | 6 +- .../mithril-devnet/devnet-visualize.sh | 6 +- .../mithril-devnet/mkfiles/mkfiles-cardano.sh | 204 + .../mithril-devnet/mkfiles/mkfiles-cleanup.sh | 8 + .../mithril-devnet/mkfiles/mkfiles-docker.sh | 306 + .../mithril-devnet/mkfiles/mkfiles-init.sh | 72 + .../mithril-devnet/mkfiles/mkfiles-mithril.sh | 137 + .../mithril-devnet/mkfiles/mkfiles-pools.sh | 108 + .../mithril-devnet/mkfiles/mkfiles-query.sh | 77 + .../mithril-devnet/mkfiles/mkfiles-start.sh | 206 + .../mkfiles/mkfiles-topology.sh | 63 + .../mithril-devnet/query-cardano.sh | 27 + .../mithril-end-to-end/Cargo.toml | 22 +- .../src/assertions/check.rs | 78 + .../mithril-end-to-end/src/assertions/exec.rs | 27 +- .../mithril-end-to-end/src/devnet/mod.rs | 2 +- .../mithril-end-to-end/src/devnet/runner.rs | 138 +- .../mithril-end-to-end/src/end_to_end_spec.rs | 25 +- .../mithril-end-to-end/src/main.rs | 57 +- .../src/mithril/aggregator.rs | 136 +- .../src/mithril/infrastructure.rs | 106 +- .../mithril-end-to-end/src/mithril/mod.rs | 9 +- .../mithril-end-to-end/src/mithril/signer.rs | 86 +- .../src/stress_test/aggregator_helpers.rs | 26 +- mithril-test-lab/test_data/README.md | 68 + .../test_data/blocks/allegra1.block | 1 + .../test_data/blocks/alonzo1.block | 1 + .../test_data/blocks/byron2.block | 1 + mithril-test-lab/test_data/blocks/mary1.block | 1 + .../test_data/blocks/shelley1.block | 1 + .../test_data/immutable/00000.chunk | Bin 0 -> 25550 bytes .../test_data/immutable/00000.primary | 0 .../test_data/immutable/00000.secondary | 0 .../test_data/immutable/00001.chunk | Bin 0 -> 5925 bytes .../test_data/immutable/00001.primary | 0 .../test_data/immutable/00001.secondary | 0 .../test_data/immutable/00002.chunk | 0 .../test_data/immutable/00002.primary | 0 .../test_data/immutable/00002.secondary | 0 openapi.yaml | 224 +- 390 files changed, 48050 insertions(+), 21820 deletions(-) create mode 100644 .github/workflows/actions/publish-npm-package/action.yml delete mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/manual-publish-npm.yml create mode 100755 .github/workflows/scripts/parse-wasm-headless-tests-results.sh create mode 100644 .github/workflows/scripts/run-wasm-tests-browser-headless.py create mode 100644 docs/runbook/manual-publish-npm/README.md create mode 100644 docs/runbook/manual-publish-npm/img/run-workflow-button.png create mode 100644 docs/runbook/manual-publish-npm/img/run-workflow-form.png create mode 100644 docs/runbook/manual-publish-npm/img/run-workflow-result.png create mode 100644 docs/website/blog/2024-01-03-signer-service-new-configuration.md create mode 100644 docs/website/blog/2024-01-23-mithril-client-npm-package-released.md create mode 100644 docs/website/blog/2024-02-08-testing-sanchonet-network-available.md create mode 100644 docs/website/package-lock.json create mode 100644 docs/website/root/manual/developer-docs/nodes/mithril-client-library-wasm.md create mode 100644 docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library-wasm.md delete mode 100644 docs/website/yarn.lock create mode 100644 mithril-aggregator/src/artifact_builder/cardano_transactions.rs create mode 100644 mithril-aggregator/src/database/cardano_transaction_migration.rs create mode 100644 mithril-aggregator/src/database/provider/cardano_transaction.rs create mode 100644 mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs create mode 100644 mithril-aggregator/src/http_server/routes/proof_routes.rs create mode 100644 mithril-aggregator/src/message_adapters/to_cardano_transaction_list_message.rs create mode 100644 mithril-aggregator/src/message_adapters/to_cardano_transaction_message.rs create mode 100644 mithril-aggregator/src/message_adapters/to_cardano_transactions_proof_message.rs create mode 100644 mithril-aggregator/src/services/prover.rs create mode 100644 mithril-aggregator/tests/open_message_expiration.rs create mode 100644 mithril-aggregator/tests/open_message_newer_exists.rs delete mode 100644 mithril-client-cli/src/aggregator_client/certificate_client.rs delete mode 100644 mithril-client-cli/src/aggregator_client/http_client.rs delete mode 100644 mithril-client-cli/src/aggregator_client/mithril_stake_distribution_client.rs delete mode 100644 mithril-client-cli/src/aggregator_client/mod.rs delete mode 100644 mithril-client-cli/src/aggregator_client/snapshot_client.rs delete mode 100644 mithril-client-cli/src/client.rs create mode 100644 mithril-client-cli/src/configuration.rs delete mode 100644 mithril-client-cli/src/dependencies/builder.rs delete mode 100644 mithril-client-cli/src/dependencies/mod.rs delete mode 100644 mithril-client-cli/src/message_adapters/from_certificate_message_adapter.rs delete mode 100644 mithril-client-cli/src/message_adapters/from_mithril_stake_distribution_message.rs delete mode 100644 mithril-client-cli/src/message_adapters/from_snapshot_message.rs delete mode 100644 mithril-client-cli/src/message_adapters/mod.rs delete mode 100644 mithril-client-cli/src/message_adapters/to_snapshot_download_message.rs delete mode 100644 mithril-client-cli/src/services/mithril_stake_distribution.rs delete mode 100644 mithril-client-cli/src/services/mock.rs delete mode 100644 mithril-client-cli/src/services/mod.rs delete mode 100644 mithril-client-cli/src/services/snapshot.rs create mode 100644 mithril-client-cli/src/utils/expander.rs create mode 100644 mithril-client-cli/src/utils/feedback_receiver.rs create mode 100644 mithril-client-cli/src/utils/snapshot.rs delete mode 100644 mithril-client-cli/src/utils/stream_reader.rs create mode 100644 mithril-client-wasm/.gitignore create mode 100644 mithril-client-wasm/.vsls.json create mode 100644 mithril-client-wasm/Cargo.toml create mode 100644 mithril-client-wasm/Makefile create mode 100644 mithril-client-wasm/README.md create mode 100644 mithril-client-wasm/npm/README.md create mode 100644 mithril-client-wasm/src/client_wasm.rs create mode 100644 mithril-client-wasm/src/lib.rs create mode 100644 mithril-client-wasm/www-test/.gitignore create mode 100644 mithril-client-wasm/www-test/README.md create mode 100644 mithril-client-wasm/www-test/bootstrap.js create mode 100644 mithril-client-wasm/www-test/index.html create mode 100644 mithril-client-wasm/www-test/index.js create mode 100644 mithril-client-wasm/www-test/package-lock.json create mode 100644 mithril-client-wasm/www-test/package.json create mode 100644 mithril-client-wasm/www-test/webpack.config.js create mode 100644 mithril-client-wasm/www/.gitignore create mode 100644 mithril-client-wasm/www/bootstrap.js create mode 100644 mithril-client-wasm/www/index.html create mode 100644 mithril-client-wasm/www/index.js create mode 100644 mithril-client-wasm/www/package-lock.json create mode 100644 mithril-client-wasm/www/package.json create mode 100644 mithril-client-wasm/www/webpack.config.js create mode 100644 mithril-client/src/cardano_transaction_proof_client.rs create mode 100644 mithril-client/tests/cardano_transaction_proof.rs create mode 100644 mithril-client/tests/extensions/routes/certificate.rs create mode 100644 mithril-client/tests/extensions/routes/mithril_stake_distribution.rs create mode 100644 mithril-client/tests/extensions/routes/mod.rs create mode 100644 mithril-client/tests/extensions/routes/proof.rs create mode 100644 mithril-client/tests/extensions/routes/snapshot.rs create mode 100644 mithril-client/tests/extensions/routes/statistics.rs create mode 100644 mithril-common/src/cardano_transaction_parser.rs create mode 100644 mithril-common/src/chain_observer/builder.rs create mode 100644 mithril-common/src/crypto_helper/merkle_tree.rs create mode 100644 mithril-common/src/entities/cardano_transaction.rs create mode 100644 mithril-common/src/entities/cardano_transactions_commitment.rs create mode 100644 mithril-common/src/entities/cardano_transactions_set_proof.rs create mode 100644 mithril-common/src/messages/cardano_transaction_commitment.rs create mode 100644 mithril-common/src/messages/cardano_transaction_commitment_list.rs create mode 100644 mithril-common/src/messages/cardano_transactions_proof.rs create mode 100644 mithril-common/src/messages/message_parts/cardano_transactions_set_proof.rs create mode 100644 mithril-common/src/signable_builder/cardano_transactions.rs create mode 100644 mithril-explorer/package-lock.json create mode 100644 mithril-explorer/src/components/VerifyCertificate/index.js delete mode 100644 mithril-explorer/yarn.lock create mode 100644 mithril-infra/configuration/testing-sanchonet/era.addr create mode 100644 mithril-infra/configuration/testing-sanchonet/era.vkey create mode 100644 mithril-infra/configuration/testing-sanchonet/genesis.vkey create mode 100644 mithril-persistence/.gitignore create mode 100644 mithril-persistence/Cargo.toml create mode 100644 mithril-persistence/Makefile create mode 100644 mithril-persistence/README.md rename {mithril-common => mithril-persistence}/src/database/db_version.rs (98%) rename {mithril-common => mithril-persistence}/src/database/mod.rs (76%) create mode 100644 mithril-persistence/src/database/signed_entity_hydrator.rs rename {mithril-common => mithril-persistence}/src/database/version_checker.rs (99%) create mode 100644 mithril-persistence/src/lib.rs rename {mithril-common => mithril-persistence}/src/sqlite/condition.rs (99%) rename {mithril-common => mithril-persistence}/src/sqlite/cursor.rs (99%) rename {mithril-common => mithril-persistence}/src/sqlite/entity.rs (100%) rename {mithril-common => mithril-persistence}/src/sqlite/mod.rs (98%) rename {mithril-common => mithril-persistence}/src/sqlite/projection.rs (100%) rename {mithril-common => mithril-persistence}/src/sqlite/provider.rs (98%) rename {mithril-common => mithril-persistence}/src/sqlite/source_alias.rs (96%) rename {mithril-common => mithril-persistence}/src/store/adapter/dumb_adapter.rs (100%) rename {mithril-common => mithril-persistence}/src/store/adapter/fail_adapter.rs (100%) rename {mithril-common => mithril-persistence}/src/store/adapter/memory_adapter.rs (100%) rename {mithril-common => mithril-persistence}/src/store/adapter/mod.rs (100%) rename {mithril-common => mithril-persistence}/src/store/adapter/sqlite_adapter.rs (100%) rename {mithril-common => mithril-persistence}/src/store/adapter/store_adapter.rs (98%) rename {mithril-common => mithril-persistence}/src/store/mod.rs (100%) rename {mithril-common => mithril-persistence}/src/store/stake_store.rs (98%) rename {mithril-common => mithril-persistence}/src/store/store_pruner.rs (99%) create mode 100644 mithril-signer/src/database/cardano_transaction_migration.rs create mode 100644 mithril-signer/src/database/provider/cardano_transaction.rs create mode 100644 mithril-signer/src/database/provider/mod.rs create mode 100644 mithril-test-lab/mithril-aggregator-fake/.gitignore create mode 100644 mithril-test-lab/mithril-aggregator-fake/Cargo.toml create mode 100644 mithril-test-lab/mithril-aggregator-fake/README.md create mode 100755 mithril-test-lab/mithril-aggregator-fake/scripts/import.sh create mode 100644 mithril-test-lab/mithril-aggregator-fake/src/application.rs create mode 100644 mithril-test-lab/mithril-aggregator-fake/src/default_values.rs create mode 100644 mithril-test-lab/mithril-aggregator-fake/src/error.rs create mode 100644 mithril-test-lab/mithril-aggregator-fake/src/handlers.rs create mode 100644 mithril-test-lab/mithril-aggregator-fake/src/main.rs create mode 100644 mithril-test-lab/mithril-aggregator-fake/src/shared_state.rs create mode 100644 mithril-test-lab/mithril-devnet/VERSION create mode 100644 mithril-test-lab/mithril-devnet/configuration/babbage/alonzo-babbage-test-genesis.json create mode 100644 mithril-test-lab/mithril-devnet/configuration/babbage/conway-babbage-test-genesis.json rename mithril-test-lab/mithril-devnet/{ => configuration/byron}/configuration.yaml (88%) create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-cardano.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-cleanup.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-docker.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-init.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-pools.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-query.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-start.sh create mode 100644 mithril-test-lab/mithril-devnet/mkfiles/mkfiles-topology.sh create mode 100644 mithril-test-lab/mithril-devnet/query-cardano.sh create mode 100644 mithril-test-lab/test_data/README.md create mode 100644 mithril-test-lab/test_data/blocks/allegra1.block create mode 100644 mithril-test-lab/test_data/blocks/alonzo1.block create mode 100644 mithril-test-lab/test_data/blocks/byron2.block create mode 100644 mithril-test-lab/test_data/blocks/mary1.block create mode 100644 mithril-test-lab/test_data/blocks/shelley1.block create mode 100644 mithril-test-lab/test_data/immutable/00000.chunk create mode 100644 mithril-test-lab/test_data/immutable/00000.primary create mode 100644 mithril-test-lab/test_data/immutable/00000.secondary create mode 100644 mithril-test-lab/test_data/immutable/00001.chunk create mode 100644 mithril-test-lab/test_data/immutable/00001.primary create mode 100644 mithril-test-lab/test_data/immutable/00001.secondary create mode 100644 mithril-test-lab/test_data/immutable/00002.chunk create mode 100644 mithril-test-lab/test_data/immutable/00002.primary create mode 100644 mithril-test-lab/test_data/immutable/00002.secondary diff --git a/.github/workflows/actions/deploy-terraform-infrastructure/action.yml b/.github/workflows/actions/deploy-terraform-infrastructure/action.yml index b0f4d3fe28a..9c6c02beef9 100644 --- a/.github/workflows/actions/deploy-terraform-infrastructure/action.yml +++ b/.github/workflows/actions/deploy-terraform-infrastructure/action.yml @@ -20,6 +20,10 @@ inputs: cardano_node_version: description: Cardano node version. required: true + cardano_node_docker_registry: + description: Cardano node Docker image registry. + required: false + default: "ghcr.io/intersectmbo/cardano-node" google_region: description: Google Cloud region name. required: true @@ -60,6 +64,10 @@ inputs: mithril_genesis_verification_key_url: description: Mithril genesis verification key location. required: true + mithril_era_reader_adapter_type: + description: Mithril era reader adapter type. + required: false + default: "cardano-chain" mithril_era_reader_address_url: description: Mithril era reader address location. required: true @@ -69,6 +77,10 @@ inputs: mithril_era_reader_secret_key: description: Mithril era reader secret key (onlye for test networks). required: false + mithril_aggregator_signed_entity_types: + description: Mithril aggregator signed entity types parameters (discriminants names in an ordered comma separated list). + required: false + default: "" mithril_aggregator_cdn_cname: description: Mithril aggregator uses CDN domain for constructing snapshot url. required: true @@ -141,6 +153,7 @@ runs: environment_prefix = "${{ inputs.environment_prefix }}" cardano_network = "${{ inputs.cardano_network }}" cardano_image_id = "${{ inputs.cardano_node_version }}" + cardano_image_registry = "${{ inputs.cardano_node_docker_registry }}" google_region = "${{ inputs.google_region }}" google_zone = "${{ inputs.google_zone }}" google_machine_type = "${{ inputs.google_machine_type }}" @@ -154,10 +167,11 @@ runs: mithril_genesis_secret_key = "${{ inputs.mithril_genesis_secret_key }}" mithril_protocol_parameters = ${{ fromJSON(inputs.mithril_protocol_parameters) }} mithril_signers = ${{ fromJSON(inputs.mithril_signers) }} - mithril_era_reader_adapter_type = "cardano-chain" + mithril_era_reader_adapter_type = "${{ inputs.mithril_era_reader_adapter_type }}" mithril_era_reader_address_url = "${{ inputs.mithril_era_reader_address_url }}" mithril_era_reader_verification_key_url = "${{ inputs.mithril_era_reader_verification_key_url }}" mithril_era_reader_secret_key = "${{ inputs.mithril_era_reader_secret_key }}" + mithril_aggregator_signed_entity_types = "${{ inputs.mithril_aggregator_signed_entity_types }}" mithril_aggregator_cdn_cname = "${{ inputs.mithril_aggregator_cdn_cname }}" mithril_aggregator_snapshot_use_cdn_domain = ${{ inputs.mithril_aggregator_snapshot_use_cdn_domain }} mithril_aggregator_snapshot_compression_algorithm = "${{ inputs.mithril_aggregator_snapshot_compression_algorithm }}" diff --git a/.github/workflows/actions/prepare-distribution/action.yml b/.github/workflows/actions/prepare-distribution/action.yml index e71e053f57a..dca92955157 100644 --- a/.github/workflows/actions/prepare-distribution/action.yml +++ b/.github/workflows/actions/prepare-distribution/action.yml @@ -58,7 +58,7 @@ runs: EOF cargo metadata --quiet --no-deps | \ - jq -r '.packages | sort_by(.name) | .[] | select([.name] | inside(["mithrildemo", "mithril-end-to-end", "mithril-relay"]) | not) | "| \(.name) | `\(.version)` |"' \ + jq -r '.packages | sort_by(.name) | .[] | select([.name] | inside(["mithrildemo", "client-mithril-stake-distribution", "client-snapshot", "mithril-end-to-end", "mithril-relay"]) | not) | "| \(.name) | `\(.version)` |"' \ >> ./release-notes-addon.txt - name: Add compatibility table diff --git a/.github/workflows/actions/publish-npm-package/action.yml b/.github/workflows/actions/publish-npm-package/action.yml new file mode 100644 index 00000000000..045f1ddd842 --- /dev/null +++ b/.github/workflows/actions/publish-npm-package/action.yml @@ -0,0 +1,83 @@ +name: publish-wasm-package +description: | + Deploy the WASM package to npm +inputs: + dry_run: + description: Dry run will not publish to npm, just test it. + required: true + package: + description: npm package name. + required: true + scope: + description: npm package scope (must not include '@' prefix). + required: true + tag: + description: npm package tag. + required: false + default: "latest" + access: + description: npm package access. + required: false + default: "public" + api_token: + description: npm API token. + required: false + +runs: + using: "composite" + steps: + - name: Check npm latest version + id: check_version + shell: bash + run: | + echo "Check crate latest published version for '${{ inputs.package}}' package" + LATEST_REMOTE_VERSION=$(npm view @${{ inputs.scope }}/${{ inputs.package }} dist-tags.${{ inputs.tag }} 2> /dev/null || true) + LOCAL_VERSION=$(cargo metadata --quiet --no-deps | jq -r '.packages[] | select(.name=="${{ inputs.package}}") | .version') + echo "Latest crate.io version: $LATEST_REMOTE_VERSION" + echo "Local version: $LOCAL_VERSION" + + if [ "$LOCAL_VERSION" != "$LATEST_REMOTE_VERSION" ]; then + echo "Local version is newer than remote version: we will publish to npm registry" + echo "should_deploy=true" >> $GITHUB_OUTPUT + else + echo "Local version and remote version are the same: no need to publish to npm registry" + echo "should_deploy=false" >> $GITHUB_OUTPUT + fi + + - name: Build package + shell: bash + run: | + echo "Build '@${{ inputs.scope }}/${{ inputs.package }}' package" + cp ./LICENSE ./mithril-client-wasm/ + cp -f ./mithril-client-wasm/npm/README.md ./mithril-client-wasm/ + wasm-pack build ${{ inputs.package }} --release --target web --out-dir ./pkg --scope ${{ inputs.scope }} --out-name index + + - name: List package + shell: bash + run: | + echo "List '@${{ inputs.scope }}/${{ inputs.package }}' package" + ls -al ${{ inputs.package }}/pkg + + - name: Test publish package + if: inputs.dry_run == 'true' && steps.check_version.outputs.should_deploy == 'true' + shell: bash + env: + NPM_TOKEN: ${{ inputs.api_token }} + run: | + echo "test publish '@${{ inputs.scope }}/${{ inputs.package }}' package" + npm set "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" + npm whoami + cd ${{ inputs.package }}/pkg + npm publish --tag ${{ inputs.tag }} --access ${{ inputs.access }} --dry-run + + - name: Publish package + if: inputs.dry_run == 'false' && steps.check_version.outputs.should_deploy == 'true' + shell: bash + env: + NPM_TOKEN: ${{ inputs.api_token }} + run: | + echo "Publish '@${{ inputs.scope }}/${{ inputs.package }}' package" + npm set "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" + npm whoami + cd ${{ inputs.package }}/pkg + npm publish --tag ${{ inputs.tag }} --access ${{ inputs.access }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72d91787cf0..42b323a6112 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,10 +7,6 @@ on: - 'hotfix**' pull_request: types: [opened, reopened, synchronize] - paths-ignore: # ignore docs only changes since they use a dedicated workflows: docs.yml - - 'docs/**' - - 'mithril-explorer/**' - - '.github/workflows/docs.yml' branches-ignore: - 'hotfix**' # hotfix are handled by the push trigger @@ -46,7 +42,7 @@ jobs: uses: ./.github/workflows/actions/build-upload-mithril-artifact with: binaries-build-args: --bin mithril-aggregator --bin mithril-signer --bin mithril-client --bin mithril-relay --features bundle_openssl,full - libraries-build-args: --package mithril-stm --package mithril-client --features full + libraries-build-args: --package mithril-stm --package mithril-client --features full,unstable - name: Build Debian packages shell: bash @@ -55,7 +51,7 @@ jobs: cargo deb --no-build --package mithril-signer cargo deb --no-build --package mithril-client-cli cargo deb --no-build --package mithril-relay - + - name: Publish Debian packages uses: actions/upload-artifact@v3 with: @@ -76,25 +72,25 @@ jobs: ERAS=$(./target/release/mithril-aggregator era list --json) echo "Test Lab Eras: $ERAS" echo "eras=$ERAS" >> $GITHUB_OUTPUT - + build: strategy: fail-fast: false matrix: os: [ macos-12, windows-latest ] - + include: # Only build client on windows & mac - os: macos-12 binaries-build-args: --bin mithril-client --features bundle_openssl - libraries-build-args: --package mithril-stm --package mithril-client --features full + libraries-build-args: --package mithril-stm --package mithril-client --features full,unstable - os: windows-latest # Use `--bins --package ` instead of `--bin `, otherwise the 'windows' compatibility # hack in mithril common cargo.toml doesn't apply (we have no idea why). binaries-build-args: --bins --package mithril-client-cli --features bundle_openssl - libraries-build-args: --package mithril-stm --package mithril-client --no-default-features --features num-integer-backend,full + libraries-build-args: --package mithril-stm --package mithril-client --no-default-features --features num-integer-backend,full,unstable runs-on: ${{ matrix.os }} - + steps: - name: Checkout sources uses: actions/checkout@v3 @@ -103,7 +99,7 @@ jobs: uses: ./.github/workflows/actions/toolchain-and-cache with: cache-version: ${{ secrets.CACHE_VERSION }} - + - name: Build Mithril workspace & publish artifacts uses: ./.github/workflows/actions/build-upload-mithril-artifact with: @@ -111,7 +107,7 @@ jobs: libraries-build-args: ${{ matrix.libraries-build-args }} common-build-args: ${{ matrix.common-build-args }} - build-wasm: + build-test-wasm: runs-on: ubuntu-22.04 steps: - name: Checkout sources @@ -123,28 +119,65 @@ jobs: cache-version: ${{ secrets.CACHE_VERSION }}-wasm cargo-tools: wasm-pack - - name: Cargo build 'mithril-client' - WASM package + - name: Build 'mithril-client-wasm' library + shell: bash + run: | + cp LICENSE ./mithril-client-wasm/ + wasm-pack build mithril-client-wasm --release --target web --out-dir ./pkg --scope mithril-dev --out-name index + + - name: Prepare 'mithril-client-wasm' package + shell: bash + run: | + cp LICENSE ./mithril-client-wasm/ + wasm-pack pack mithril-client-wasm/pkg + + - name: Build a fake aggregator + shell: bash + run: cargo build -p mithril-aggregator-fake + + - name: Start a fake aggregator + shell: bash + run: cargo run -p mithril-aggregator-fake -- -p 8000 & + + - name: Test 'mithril-client-wasm' - Chrome + shell: bash + run: | + wasm-pack test --headless --chrome mithril-client-wasm --release + + - name: Test 'mithril-client-wasm' - Firefox + shell: bash + run: | + wasm-pack test --headless --firefox mithril-client-wasm --release + + - name: Test 'mithril-client-wasm' - NodeJS shell: bash run: | - wasm-pack build mithril-client --release + wasm-pack test --node mithril-client-wasm --release + - name: Publish Mithril Distribution (WASM) + uses: actions/upload-artifact@v3 + with: + name: mithril-distribution-wasm + path: | + mithril-client-wasm/**/*-mithril-client-wasm-*.tgz + if-no-files-found: error test: strategy: fail-fast: false matrix: os: [ ubuntu-22.04, macos-12, windows-latest ] - + include: - os: ubuntu-22.04 - test-args: --features portable,full --workspace + test-args: --features portable,full,unstable --workspace # Only test client on windows & mac (since its the only binaries supported for those os for now) - os: macos-12 - test-args: --package mithril-client --package mithril-client-cli --features full + test-args: --package mithril-client --package mithril-client-cli --features full,unstable - os: windows-latest - test-args: --package mithril-client --package mithril-client-cli --features full - + test-args: --package mithril-client --package mithril-client-cli --features full,unstable + runs-on: ${{ matrix.os }} - + steps: - name: Checkout sources uses: actions/checkout@v3 @@ -154,7 +187,7 @@ jobs: with: cache-version: ${{ secrets.CACHE_VERSION }} cargo-tools: cargo-nextest - + - name: Build tests run: cargo nextest run --no-run ${{ matrix.test-args }} @@ -180,7 +213,7 @@ jobs: name: test-results${{ matrix.artifact-suffix }}-${{ runner.os }}-${{ runner.arch }} path: | ./test-results-*.xml - + check: runs-on: ubuntu-22.04 steps: @@ -199,7 +232,7 @@ jobs: cargo clippy \ --all-features --all-targets --no-deps --message-format=json \ | clippy-sarif | tee rust-clippy-results.sarif | sarif-fmt - + # Make this step fail if any warning has been found if [[ $(cat rust-clippy-results.sarif | jq '.runs[0].results') != "[]" ]]; then false @@ -221,7 +254,7 @@ jobs: if: success() || failure() shell: bash run: cargo sort -w -c - + - name: Dependency & Vulnerabilities Review if: github.event_name == 'pull_request' uses: actions/dependency-review-action@v3 @@ -229,19 +262,33 @@ jobs: base-ref: ${{ github.event.pull_request.base.sha || 'main' }} head-ref: ${{ github.event.pull_request.head.sha || github.ref }} - run-test-lab: + e2e: runs-on: ubuntu-22.04 needs: [ build-ubuntu-X64 ] strategy: fail-fast: false matrix: + mode: ["std"] era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras) }} - run_id: [1,2,3] + cardano_node_version: ["8.7.3"] + hard_fork_latest_era_at_epoch: [0,10,100] + run_id: ["#1","#2"] extra_args: [""] include: - - era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} - run_id: 3 + # Include a hard fork test for `8.1.2` which is not concerned + - mode: "std" + era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} + cardano_node_version: "8.1.2" + hard_fork_latest_era_at_epoch: 100 + run_id: "#1" + extra_args: "" + # Include a test for the P2P mode + - mode: "p2p" + era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }} + cardano_node_version: "8.7.3" + hard_fork_latest_era_at_epoch: 100 + run_id: "#1" extra_args: "--use-p2p-network" steps: - name: Checkout sources @@ -268,13 +315,20 @@ jobs: mkdir artifacts - name: Test - run: ./mithril-end-to-end -vvv --bin-directory ./bin --work-directory=./artifacts --devnet-scripts-directory=./mithril-test-lab/mithril-devnet --mithril-era=${{ matrix.era }} ${{ matrix.extra_args }} + run: | + ./mithril-end-to-end -vvv \ + --bin-directory ./bin \ + --work-directory=./artifacts \ + --devnet-scripts-directory=./mithril-test-lab/mithril-devnet \ + --mithril-era=${{ matrix.era }} \ + --cardano-node-version ${{ matrix.cardano_node_version }} \ + --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }} - name: Upload E2E Tests Artifacts if: ${{ failure() }} uses: actions/upload-artifact@v3 with: - name: mithril-e2e-tests-artifacts-run_${{ github.run_number }}-attempt_${{ github.run_attempt }}-era_${{ matrix.era }}-run_id_${{ matrix.run_id }} + name: mithril-e2e-tests-artifacts-run_${{ github.run_number }}-attempt_${{ github.run_attempt }}-mode_${{ matrix.mode }}-era_${{ matrix.era }}-cardano-${{ matrix.cardano_node_version }}-fork-${{ matrix.hard_fork_latest_era_at_epoch }}-run_id_${{ matrix.run_id }} path: | ./artifacts/* # including node.sock makes the upload fails so exclude them: @@ -283,7 +337,7 @@ jobs: !./artifacts/devnet/cardano-cli !./artifacts/devnet/cardano-node if-no-files-found: error - + publish-tests-results: if: success() || failure() runs-on: ubuntu-22.04 @@ -320,7 +374,7 @@ jobs: - build - check - test - - run-test-lab + - e2e strategy: fail-fast: false matrix: @@ -329,7 +383,7 @@ jobs: include: - project: mithril-client-cli package: mithril-client - + permissions: contents: read packages: write @@ -381,12 +435,12 @@ jobs: max-parallel: 1 matrix: package: [ mithril-stm, mithril-common, mithril-client ] - + runs-on: ubuntu-22.04 needs: - build - test - - run-test-lab + - e2e - check steps: - name: Checkout sources @@ -396,32 +450,68 @@ jobs: uses: dtolnay/rust-toolchain@master with: toolchain: stable - + - name: Publish package to crates.io uses: ./.github/workflows/actions/publish-crate-package with: dry_run: "true" package: ${{ matrix.package }} + publish-wasm-test: + strategy: + fail-fast: false + max-parallel: 1 + matrix: + package: [ mithril-client-wasm ] + include: + - package: mithril-client-wasm + scope: mithril-dev + tag: latest + access: public + api_token_secret_name: NPM_API_TOKEN_MITHRIL_CLIENT_WASM + + runs-on: ubuntu-22.04 + needs: + - build-test-wasm + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain, tools, and restore cache + uses: ./.github/workflows/actions/toolchain-and-cache + with: + cache-version: ${{ secrets.CACHE_VERSION }}-wasm + cargo-tools: wasm-pack + + - name: Publish package to npm + uses: ./.github/workflows/actions/publish-npm-package + with: + dry_run: "true" + package: ${{ matrix.package }} + scope: ${{ matrix.scope }} + access: ${{ matrix.access }} + api_token: ${{ secrets[matrix.api_token_secret_name] }} + unstable-release: - if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith('refs/heads/hotfix', github.ref)) + if: vars.PUBLISH_UNSTABLE_RELEASE_IN_CI == 'true' && github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith('refs/heads/hotfix', github.ref)) runs-on: ubuntu-22.04 needs: - build + - build-test-wasm - test - - run-test-lab + - e2e - check steps: - name: Checkout sources uses: actions/checkout@v3 - + - name: Prepare packaging run: mkdir package - name: Get short SHA id: slug run: echo "sha8=$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT - + - name: Download built artifacts (Linux-X64) uses: actions/download-artifact@v3 with: @@ -453,7 +543,7 @@ jobs: download-url-base: ${{ github.server_url }}/${{ github.repository }}/releases/download/unstable gpg-secret-key: ${{ secrets.GPG_SECRET_KEY }} compatibility-table: '{ "release-mainnet": "⛔", "release-preprod": "⛔", "pre-release-preview": "⛔", "testing-preview": "✔" }' - + - name: Update unstable release uses: marvinpinto/action-automatic-releases@latest with: @@ -473,12 +563,11 @@ jobs: body_path: ./release-notes-addon.txt deploy-testing: - # Don't run on pull request from forks since they don't have access to all the needed secrets - if: github.event_name == 'push' || (github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork) + if: vars.DEPLOY_NETWORKS_IN_CI == 'true' && (github.event_name == 'push' || github.event_name == 'pull_request') strategy: fail-fast: false matrix: - environment: [ testing-preview ] + environment: [ testing-preview, testing-sanchonet ] include: - environment: testing-preview environment_prefix: testing @@ -509,6 +598,30 @@ jobs: terraform_backend_bucket: hydra-terraform-admin google_region: europe-west1 google_zone: europe-west1-b + google_machine_type: e2-standard-8 + google_compute_instance_boot_disk_size: 200 + google_compute_instance_data_disk_size: 250 + - environment: testing-sanchonet + environment_prefix: testing + cardano_network: sanchonet + mithril_use_p2p_network: false + mithril_api_domain: api.mithril.network + mithril_protocol_parameters: | + { + k = 5 + m = 100 + phi_f = 0.65 + } + mithril_signers: | + { + "1" = { + type = "verified", + pool_id = "", + }, + } + terraform_backend_bucket: hydra-terraform-admin + google_region: europe-west1 + google_zone: europe-west1-b google_machine_type: e2-highmem-4 google_compute_instance_boot_disk_size: 200 google_compute_instance_data_disk_size: 250 @@ -537,6 +650,7 @@ jobs: environment: ${{ matrix.environment }} cardano_network: ${{ matrix.cardano_network }} cardano_node_version: ${{ vars.CARDANO_NODE_VERSION }} + cardano_node_docker_registry: ${{ vars.CARDANO_NODE_DOCKER_REGISTRY }} google_region: ${{ matrix.google_region }} google_zone: ${{ matrix.google_zone }} google_machine_type: ${{ matrix.google_machine_type }} @@ -553,6 +667,7 @@ jobs: mithril_era_reader_address_url: ${{ vars.ERA_READER_ADDRESS_URL }} mithril_era_reader_verification_key_url: ${{ vars.ERA_READER_VERIFICATION_KEY_URL }} mithril_era_reader_secret_key: ${{ secrets.ERA_READER_SECRET_KEY }} + mithril_aggregator_signed_entity_types: ${{ vars.AGGREGATOR_SIGNED_ENTITY_TYPES }} mithril_aggregator_cdn_cname: ${{ vars.AGGREGATOR_CDN_CNAME }} mithril_aggregator_snapshot_use_cdn_domain: ${{ vars.AGGREGATOR_USE_CDN_DOMAIN }} mithril_aggregator_snapshot_compression_algorithm: ${{ vars.AGGREGATOR_SNAPSHOT_COMPRESSION_ALGORITHM }} @@ -570,3 +685,193 @@ jobs: loki_ingest_username: ${{ secrets.LOKI_INGEST_USERNAME }} loki_ingest_password: ${{ secrets.LOKI_INGEST_PASSWORD }} + cargo-doc: + runs-on: ubuntu-22.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain and restore cache + uses: ./.github/workflows/actions/toolchain-and-cache + with: + cache-version: ${{ secrets.CACHE_VERSION }} + cargo-tools: clippy-sarif sarif-fmt + + - name: Generate cargo doc + run: | + # Force `--lib` to avoid a collision between the client lib and the client cli binary who share + # the same name (we only want to document those anyway) + cargo doc --no-deps --lib -p mithril-stm -p mithril-common -p mithril-persistence \ + -p mithril-aggregator -p mithril-signer -p mithril-client -p mithril-client-cli \ + --all-features --message-format=json \ + | clippy-sarif | tee rust-cargo-doc-results.sarif | sarif-fmt + + # Update tool sarif metadata from "clippy" to "cargo-doc" (since it's set this way by clippy-sarif) + contents=$(cat rust-cargo-doc-results.sarif \ + | jq '.runs[].tool.driver.name = "cargo-doc"' \ + | jq '.runs[].tool.driver.informationUri = "https://doc.rust-lang.org/cargo/commands/cargo-doc.html"' \ + ) + echo -E "${contents}" > rust-cargo-doc-results.sarif + + # Make this step fail if any warning has been found + if [[ $(cat rust-cargo-doc-results.sarif | jq '.runs[0].results') != "[]" ]]; then + false + fi + + - name: Upload cargo-doc results to GitHub + if: success() || failure() + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: rust-cargo-doc-results.sarif + wait-for-processing: true + + - name: Publish Mithril-rust-doc + uses: actions/upload-artifact@v3 + with: + name: mithril-rust-doc + if-no-files-found: error + path: | + target/doc/ + + build-docusaurus: + runs-on: ubuntu-22.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + cache-dependency-path: docs/website/package-lock.json + + - name: Install dependencies + working-directory: docs/website + run: npm ci + + - name: Build Docusaurus site + working-directory: docs/website + run: | + npm run build + + - name: Publish Docusaurus build + uses: actions/upload-artifact@v3 + with: + name: docusaurus-build + if-no-files-found: error + path: | + docs/website/build/* + + build-test-explorer: + runs-on: ubuntu-22.04 + needs: build-test-wasm + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Download built artifacts + uses: actions/download-artifact@v3 + with: + name: mithril-distribution-wasm + path: mithril-client-wasm + + - name: Unpack 'mithril-client-wasm' package + working-directory: mithril-client-wasm + run: + tar -xvzf pkg/*.tgz -C pkg/ && mv pkg/package/* pkg/ + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + cache-dependency-path: mithril-explorer/package-lock.json + + - name: Install dependencies + working-directory: mithril-explorer + run: npm ci + + - name: Test explorer + working-directory: mithril-explorer + run: make test + + - name: Check explorer + working-directory: mithril-explorer + run: make lint + + - name: Build Explorer + working-directory: mithril-explorer + run: make build + + - name: Publish Explorer build + uses: actions/upload-artifact@v3 + with: + name: explorer-build + if-no-files-found: error + path: | + mithril-explorer/out/* + + build-open-api-ui: + runs-on: ubuntu-22.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Build OpenAPI UI + uses: Legion2/swagger-ui-action@v1 + with: + output: out/ + spec-file: ./openapi.yaml + + - name: Publish OpenAPI UI build + uses: actions/upload-artifact@v3 + with: + name: openapi-ui-build + if-no-files-found: error + path: | + out/* + + publish-docs: + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + runs-on: ubuntu-22.04 + needs: + - cargo-doc + - build-docusaurus + - build-test-explorer + - build-open-api-ui + steps: + - name: Download mithril-rust-doc artifact + uses: actions/download-artifact@v3 + with: + name: mithril-rust-doc + path: ./github-pages/rust-doc + + - name: Download Docusaurus build + uses: actions/download-artifact@v3 + with: + name: docusaurus-build + path: ./github-pages/doc + + - name: Download Explorer build + uses: actions/download-artifact@v3 + with: + name: explorer-build + path: ./github-pages/explorer + + - name: Download OpenAPI UI build + uses: actions/download-artifact@v3 + with: + name: openapi-ui-build + path: ./github-pages/openapi-ui + + - name: Add CNAME & Redirect + run: | + echo "mithril.network" > ./github-pages/CNAME + echo '' > ./github-pages/index.html + + - name: Mithril / Publish GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN || github.token }} + publish_dir: ./github-pages \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 480d56b22f8..00000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,186 +0,0 @@ -name: Documentations & Explorer - -on: - push: - branches: - - 'main' - pull_request: - types: [opened, reopened, synchronize] - -concurrency: - group: ci-docs-${{ github.ref }} - cancel-in-progress: true - -jobs: - cargo-doc: - runs-on: ubuntu-22.04 - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Install stable toolchain and restore cache - uses: ./.github/workflows/actions/toolchain-and-cache - with: - cache-version: ${{ secrets.CACHE_VERSION }} - cargo-tools: clippy-sarif sarif-fmt - - - name: Generate cargo doc - run: | - cargo doc --no-deps -p mithril-stm -p mithril-common -p mithril-aggregator \ - -p mithril-signer -p mithril-client -p mithril-client-cli \ - --all-features --message-format=json \ - | clippy-sarif | tee rust-cargo-doc-results.sarif | sarif-fmt - - # Update tool sarif metadata from "clippy" to "cargo-doc" (since it's set this way by clippy-sarif) - contents=$(cat rust-cargo-doc-results.sarif \ - | jq '.runs[].tool.driver.name = "cargo-doc"' \ - | jq '.runs[].tool.driver.informationUri = "https://doc.rust-lang.org/cargo/commands/cargo-doc.html"' \ - ) - echo -E "${contents}" > rust-cargo-doc-results.sarif - - # Make this step fail if any warning has been found - if [[ $(cat rust-cargo-doc-results.sarif | jq '.runs[0].results') != "[]" ]]; then - false - fi - - - name: Upload cargo-doc results to GitHub - if: success() || failure() - uses: github/codeql-action/upload-sarif@v2 - with: - sarif_file: rust-cargo-doc-results.sarif - wait-for-processing: true - - - name: Publish Mithril-rust-doc - uses: actions/upload-artifact@v3 - with: - name: mithril-rust-doc - if-no-files-found: error - path: | - target/doc/ - - build-docusaurus: - runs-on: ubuntu-22.04 - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'yarn' - cache-dependency-path: docs/website/yarn.lock - - - name: Build Docusaurus site - working-directory: docs/website - run: | - yarn && yarn build - - - name: Publish Docusaurus build - uses: actions/upload-artifact@v3 - with: - name: docusaurus-build - if-no-files-found: error - path: | - docs/website/build/* - - build-test-explorer: - runs-on: ubuntu-22.04 - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'yarn' - cache-dependency-path: mithril-explorer/yarn.lock - - - name: Install dependencies - working-directory: mithril-explorer - run: yarn install --frozen-lockfile - - - name: Test explorer - working-directory: mithril-explorer - run: make test - - - name: Check explorer - working-directory: mithril-explorer - run: make lint - - - name: Build Explorer - working-directory: mithril-explorer - run: make build - - - name: Publish Explorer build - uses: actions/upload-artifact@v3 - with: - name: explorer-build - if-no-files-found: error - path: | - mithril-explorer/out/* - - build-open-api-ui: - runs-on: ubuntu-22.04 - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Build OpenAPI UI - uses: Legion2/swagger-ui-action@v1 - with: - output: out/ - spec-file: ./openapi.yaml - - - name: Publish OpenAPI UI build - uses: actions/upload-artifact@v3 - with: - name: openapi-ui-build - if-no-files-found: error - path: | - out/* - - publish-docs: - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - runs-on: ubuntu-22.04 - needs: - - cargo-doc - - build-docusaurus - - build-test-explorer - - build-open-api-ui - steps: - - name: Download mithril-rust-doc artifact - uses: actions/download-artifact@v3 - with: - name: mithril-rust-doc - path: ./github-pages/rust-doc - - - name: Download Docusaurus build - uses: actions/download-artifact@v3 - with: - name: docusaurus-build - path: ./github-pages/doc - - - name: Download Explorer build - uses: actions/download-artifact@v3 - with: - name: explorer-build - path: ./github-pages/explorer - - - name: Download OpenAPI UI build - uses: actions/download-artifact@v3 - with: - name: openapi-ui-build - path: ./github-pages/openapi-ui - - - name: Add CNAME & Redirect - run: | - echo "mithril.network" > ./github-pages/CNAME - echo '' > ./github-pages/index.html - - - name: Mithril / Publish GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN || github.token }} - publish_dir: ./github-pages diff --git a/.github/workflows/manual-publish-npm.yml b/.github/workflows/manual-publish-npm.yml new file mode 100644 index 00000000000..a408793eeb6 --- /dev/null +++ b/.github/workflows/manual-publish-npm.yml @@ -0,0 +1,71 @@ +name: Manual npm publication + +on: + workflow_dispatch: + inputs: + commit_sha: + description: | + SHA of the commit on which the mithril npm packages should be obtained. + required: true + type: string + package: + description: | + Packages(s) to be published to npm registry. + required: true + type: choice + options: + - all + - mithril-client-wasm + tag: + description: | + Package(s) tag to be published to npm registry. + required: true + type: choice + options: + - latest + - next + dry_run: + description: Dry run will not publish packages to npm registry. + required: true + type: boolean + default: true + +jobs: + publish-package: + strategy: + fail-fast: true + max-parallel: 1 + matrix: + package: [ mithril-client-wasm ] + include: + - package: mithril-client-wasm + scope: mithril-dev + tag: latest + access: public + api_token_secret_name: NPM_API_TOKEN_MITHRIL_CLIENT_WASM + + runs-on: ubuntu-22.04 + steps: + - name: Checkout sources + if: inputs.package == matrix.package || inputs.package == 'all' + uses: actions/checkout@v3 + with: + ref: ${{ inputs.commit_sha }} + + - name: Install stable toolchain, tools, and restore cache + if: inputs.package == matrix.package || inputs.package == 'all' + uses: ./.github/workflows/actions/toolchain-and-cache + with: + cache-version: ${{ secrets.CACHE_VERSION }}-wasm + cargo-tools: wasm-pack + + - name: Publish package to npm + if: inputs.package == matrix.package || inputs.package == 'all' + uses: ./.github/workflows/actions/publish-npm-package + with: + dry_run: ${{ inputs.dry_run }} + package: ${{ matrix.package }} + scope: ${{ matrix.scope }} + tag: ${{ matrix.tag }} + access: ${{ matrix.access }} + api_token: ${{ secrets[matrix.api_token_secret_name] }} \ No newline at end of file diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index afdc8af4dc1..45838763c27 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -9,6 +9,8 @@ on: jobs: create-pre-release: runs-on: ubuntu-22.04 + permissions: + contents: write steps: - name: Checkout sources uses: actions/checkout@v3 @@ -193,6 +195,7 @@ jobs: environment: ${{ matrix.environment }} cardano_network: ${{ matrix.cardano_network }} cardano_node_version: ${{ vars.CARDANO_NODE_VERSION }} + cardano_node_docker_registry: ${{ vars.CARDANO_NODE_DOCKER_REGISTRY }} google_region: ${{ matrix.google_region }} google_zone: ${{ matrix.google_zone }} google_machine_type: ${{ matrix.google_machine_type }} @@ -208,6 +211,7 @@ jobs: mithril_era_reader_address_url: ${{ vars.ERA_READER_ADDRESS_URL }} mithril_era_reader_verification_key_url: ${{ vars.ERA_READER_VERIFICATION_KEY_URL }} mithril_era_reader_secret_key: ${{ secrets.ERA_READER_SECRET_KEY }} + mithril_aggregator_signed_entity_types: ${{ vars.AGGREGATOR_SIGNED_ENTITY_TYPES }} mithril_aggregator_cdn_cname: ${{ vars.AGGREGATOR_CDN_CNAME }} mithril_aggregator_snapshot_use_cdn_domain: ${{ vars.AGGREGATOR_USE_CDN_DOMAIN }} mithril_aggregator_snapshot_compression_algorithm: ${{ vars.AGGREGATOR_SNAPSHOT_COMPRESSION_ALGORITHM }} @@ -247,3 +251,37 @@ jobs: with: dry_run: "true" package: ${{ matrix.package }} + + publish-wasm-test: + strategy: + fail-fast: false + max-parallel: 1 + matrix: + package: [ mithril-client-wasm ] + include: + - package: mithril-client-wasm + scope: mithril-dev + tag: next + access: public + api_token_secret_name: NPM_API_TOKEN_MITHRIL_CLIENT_WASM + + runs-on: ubuntu-22.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain, tools, and restore cache + uses: ./.github/workflows/actions/toolchain-and-cache + with: + cache-version: ${{ secrets.CACHE_VERSION }}-wasm + cargo-tools: wasm-pack + + - name: Publish package to npm + uses: ./.github/workflows/actions/publish-npm-package + with: + dry_run: "false" + package: ${{ matrix.package }} + scope: ${{ matrix.scope }} + tag: next + access: ${{ matrix.access }} + api_token: ${{ secrets[matrix.api_token_secret_name] }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index af508ecd53f..29455611e94 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -135,6 +135,7 @@ jobs: environment: ${{ matrix.environment }} cardano_network: ${{ matrix.cardano_network }} cardano_node_version: ${{ vars.CARDANO_NODE_VERSION }} + cardano_node_docker_registry: ${{ vars.CARDANO_NODE_DOCKER_REGISTRY }} google_region: ${{ matrix.google_region }} google_zone: ${{ matrix.google_zone }} google_machine_type: ${{ matrix.google_machine_type }} @@ -148,6 +149,7 @@ jobs: mithril_genesis_verification_key_url: ${{ vars.GENESIS_VERIFICATION_KEY_URL }} mithril_era_reader_address_url: ${{ vars.ERA_READER_ADDRESS_URL }} mithril_era_reader_verification_key_url: ${{ vars.ERA_READER_VERIFICATION_KEY_URL }} + mithril_aggregator_signed_entity_types: ${{ vars.AGGREGATOR_SIGNED_ENTITY_TYPES }} mithril_aggregator_cdn_cname: ${{ vars.AGGREGATOR_CDN_CNAME }} mithril_aggregator_snapshot_use_cdn_domain: ${{ vars.AGGREGATOR_USE_CDN_DOMAIN }} mithril_aggregator_snapshot_compression_algorithm: ${{ vars.AGGREGATOR_SNAPSHOT_COMPRESSION_ALGORITHM }} @@ -195,3 +197,37 @@ jobs: dry_run: "false" package: ${{ matrix.package }} api_token: ${{ secrets[matrix.api_token_secret_name] }} + + publish-wasm: + strategy: + fail-fast: false + max-parallel: 1 + matrix: + package: [ mithril-client-wasm ] + include: + - package: mithril-client-wasm + scope: mithril-dev + tag: latest + access: public + api_token_secret_name: NPM_API_TOKEN_MITHRIL_CLIENT_WASM + + runs-on: ubuntu-22.04 + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain, tools, and restore cache + uses: ./.github/workflows/actions/toolchain-and-cache + with: + cache-version: ${{ secrets.CACHE_VERSION }}-wasm + cargo-tools: wasm-pack + + - name: Publish package to npm + uses: ./.github/workflows/actions/publish-npm-package + with: + dry_run: "false" + package: ${{ matrix.package }} + scope: ${{ matrix.scope }} + tag: latest + access: ${{ matrix.access }} + api_token: ${{ secrets[matrix.api_token_secret_name] }} diff --git a/.github/workflows/scripts/parse-wasm-headless-tests-results.sh b/.github/workflows/scripts/parse-wasm-headless-tests-results.sh new file mode 100755 index 00000000000..e4288ef37d2 --- /dev/null +++ b/.github/workflows/scripts/parse-wasm-headless-tests-results.sh @@ -0,0 +1,20 @@ +FILENAME=$1 + +if [ ! -e "$FILENAME" ]; then + echo "Error: File '$FILENAME' not found." + exit 1 +fi + +echo "Parse headless test results from file: '$FILENAME'" +if grep -q 'title="FAILED"' "$FILENAME"; then + FAILED_INFO=$(grep -oE '
([^<]+)' "$FILENAME" | awk 'NR==1 {print substr($0, index($0,$4))}') + echo "$FAILED_INFO" + exit 1 +elif grep -q 'title="OK"' "$FILENAME"; then + grep -oE '
([^<]+)' "$FILENAME" | awk '{print substr($0, index($0,$4))}' + echo "Success: all tests passed." +else + cat "$FILENAME" + echo "No test results found. Check '$FILENAME' output." + exit 1 +fi diff --git a/.github/workflows/scripts/run-wasm-tests-browser-headless.py b/.github/workflows/scripts/run-wasm-tests-browser-headless.py new file mode 100644 index 00000000000..86af05779fc --- /dev/null +++ b/.github/workflows/scripts/run-wasm-tests-browser-headless.py @@ -0,0 +1,44 @@ +import logging +import argparse +import sys +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + +def run_headless_test(): + parser = argparse.ArgumentParser(description='Run headless browser test.') + parser.add_argument('browser_type', choices=['chrome', 'firefox'], help='Browser type (chrome or firefox)') + args = parser.parse_args() + + if args.browser_type.lower() == 'chrome': + options = webdriver.ChromeOptions() + options.add_argument("--headless=new") + driver = webdriver.Chrome(options=options) + elif args.browser_type.lower() == 'firefox': + options = webdriver.FirefoxOptions() + options.add_argument("--headless") + driver = webdriver.Firefox(options=options) + else: + logging.error("Invalid browser type. Supported types are 'chrome' and 'firefox'.") + return + + try: + driver.get('http://localhost:8080/') + + # Adjust the timeout to 3 minutes + wait = WebDriverWait(driver, 180) + + # Wait until the div with id "tests_finished" is displayed + tests_finished_element = wait.until(EC.presence_of_element_located((By.ID, "tests_finished"))) + + html = driver.page_source + result_file = f"{args.browser_type.lower()}-results.html" + with open(result_file, "w", encoding="utf-8") as file: + file.write(html) + + finally: + driver.quit() + +if __name__ == "__main__": + run_headless_test() diff --git a/.github/workflows/test-client.yml b/.github/workflows/test-client.yml index 6373bc8801a..1c667bb05fa 100644 --- a/.github/workflows/test-client.yml +++ b/.github/workflows/test-client.yml @@ -159,3 +159,77 @@ jobs: - name: Mithril Stake Distribution / download & restore latest shell: bash run: ${{ steps.command.outputs.mithril_client }} ${{ steps.prepare.outputs.debug_level }} mithril-stake-distribution download $MITHRIL_STAKE_DISTRIBUTION_HASH --download-dir /app + + test-mithril-client-wasm: + strategy: + fail-fast: false + matrix: + os: [ ubuntu-22.04 ] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Download built artifacts + uses: dawidd6/action-download-artifact@v2 + with: + name: mithril-distribution-wasm + path: ./mithril-client-wasm + commit: ${{ steps.prepare.outputs.sha }} + branch: ${{ steps.prepare.outputs.branch }} + workflow: ci.yml + workflow_conclusion: success + + - name: Unpack 'mithril-client-wasm' package + working-directory: mithril-client-wasm + run: tar -xvzf pkg/*.tgz -C pkg/ && mv pkg/package/* pkg/ + + - name: Install dependencies + working-directory: mithril-client-wasm + run: make www-test-install + + - name: Create .env file + working-directory: mithril-client-wasm + run: | + echo "AGGREGATOR_ENDPOINT=${{ inputs.aggregator_endpoint }}" > ./www-test/.env + echo "GENESIS_VERIFICATION_KEY=$(curl -s ${{ inputs.genesis_verification_key }})" >> ./www-test/.env + + - name: Start the server + working-directory: mithril-client-wasm + shell: bash + run: make www-test-serve & + + - name: Wait for the server to be ready + shell: bash + run: | + MAX_ATTEMPTS=30 + CURRENT_ATTEMPT=0 + while true + do + sleep 1 + CURRENT_ATTEMPT=$(( ${CURRENT_ATTEMPT} + 1 )) + if nc -z localhost 8080; then + echo "Server is ready." + break + fi + if [ "$CURRENT_ATTEMPT" -ge "$MAX_ATTEMPTS" ]; then + echo "Error: Server not ready after $MAX_ATTEMPTS attempts." + exit 1 + fi + done + + - name: Install selenium + shell: bash + run: pip install selenium + + - name: Run Chrome headless + shell: bash + run: | + python3 ./.github/workflows/scripts/run-wasm-tests-browser-headless.py chrome + ./.github/workflows/scripts/parse-wasm-headless-tests-results.sh chrome-results.html + + - name: Run Firefox headless + shell: bash + run: | + python3 ./.github/workflows/scripts/run-wasm-tests-browser-headless.py firefox + ./.github/workflows/scripts/parse-wasm-headless-tests-results.sh firefox-results.html diff --git a/.github/workflows/test-deploy-network.yml b/.github/workflows/test-deploy-network.yml index 1ad761cdc6e..91505c19e8c 100644 --- a/.github/workflows/test-deploy-network.yml +++ b/.github/workflows/test-deploy-network.yml @@ -33,6 +33,7 @@ jobs: cardano_network: preview mithril_use_p2p_network: true mithril_api_domain: api.mithril.network + mithril_era_reader_adapter_type: cardano-chain mithril_protocol_parameters: | { k = 5 @@ -81,6 +82,7 @@ jobs: environment: ${{ matrix.environment }} cardano_network: ${{ matrix.cardano_network }} cardano_node_version: ${{ vars.CARDANO_NODE_VERSION }} + cardano_node_docker_registry: ${{ vars.CARDANO_NODE_DOCKER_REGISTRY }} google_region: ${{ matrix.google_region }} google_zone: ${{ matrix.google_zone }} google_machine_type: ${{ matrix.google_machine_type }} @@ -94,9 +96,11 @@ jobs: mithril_signers: ${{ toJSON(matrix.mithril_signers) }} mithril_genesis_secret_key: ${{ secrets.GENESIS_SECRET_KEY }} mithril_genesis_verification_key_url: ${{ vars.GENESIS_VERIFICATION_KEY_URL }} + mithril_era_reader_adapter_type: ${{ matrix.mithril_era_reader_adapter_type }} mithril_era_reader_address_url: ${{ vars.ERA_READER_ADDRESS_URL }} mithril_era_reader_verification_key_url: ${{ vars.ERA_READER_VERIFICATION_KEY_URL }} mithril_era_reader_secret_key: ${{ secrets.ERA_READER_SECRET_KEY }} + mithril_aggregator_signed_entity_types: ${{ vars.AGGREGATOR_SIGNED_ENTITY_TYPES }} mithril_aggregator_cdn_cname: ${{ vars.AGGREGATOR_CDN_CNAME }} mithril_aggregator_snapshot_use_cdn_domain: ${{ vars.AGGREGATOR_USE_CDN_DOMAIN }} mithril_aggregator_snapshot_compression_algorithm: ${{ vars.AGGREGATOR_SNAPSHOT_COMPRESSION_ALGORITHM }} diff --git a/.github/workflows/test-docker-distribution.yml b/.github/workflows/test-docker-distribution.yml index ef2f37270d6..61b5019436f 100644 --- a/.github/workflows/test-docker-distribution.yml +++ b/.github/workflows/test-docker-distribution.yml @@ -18,7 +18,7 @@ on: description: The url of the archive of the Cardano binaries required: true type: string - default: https://github.com/input-output-hk/cardano-node/releases/download/8.1.2/cardano-node-8.1.2-linux.tar.gz + default: https://github.com/input-output-hk/cardano-node/releases/download/8.7.3/cardano-node-8.7.3-linux.tar.gz dry_run: description: Dry run will not push the Docker images to the registry required: true diff --git a/Cargo.lock b/Cargo.lock index 2c716b55525..b0d74bef246 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -54,9 +54,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -65,9 +65,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", "getrandom", @@ -115,9 +115,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -129,43 +129,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arc-swap" @@ -243,6 +243,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "async-channel" version = "1.9.0" @@ -256,13 +266,13 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 4.0.0", - "event-listener-strategy", + "event-listener 5.0.0", + "event-listener-strategy 0.5.0", "futures-core", "pin-project-lite", ] @@ -273,26 +283,26 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock 3.1.2", + "async-lock 3.3.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4353121d5644cdf2beb5726ab752e79a8db1ebb52031770ec47db31d245526" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 2.1.1", + "async-channel 2.2.0", "async-executor", - "async-io 2.2.1", - "async-lock 3.1.2", + "async-io 2.3.1", + "async-lock 3.3.0", "blocking", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "once_cell", ] @@ -318,18 +328,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" +checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" dependencies = [ - "async-lock 3.1.2", + "async-lock 3.3.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "parking", - "polling 3.3.1", - "rustix 0.38.25", + "polling 3.4.0", + "rustix 0.38.31", "slab", "tracing", "windows-sys 0.52.0", @@ -346,12 +356,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.1.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea8b3453dd7cc96711834b75400d671b73e3656975fa68d9f277163b7f7e316" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" dependencies = [ - "event-listener 4.0.0", - "event-listener-strategy", + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", "pin-project-lite", ] @@ -377,7 +387,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.25", + "rustix 0.38.31", "windows-sys 0.48.0", ] @@ -389,7 +399,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -398,13 +408,13 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.1", + "async-io 2.3.1", "async-lock 2.8.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.25", + "rustix 0.38.31", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -416,6 +426,7 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ + "async-attributes", "async-channel 1.9.0", "async-global-executor", "async-io 1.13.0", @@ -439,32 +450,19 @@ dependencies = [ [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", -] - -[[package]] -name = "asynchronous-codec" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite", + "syn 2.0.48", ] [[package]] @@ -492,7 +490,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" dependencies = [ - "http", + "http 0.2.11", "log", "url", ] @@ -514,6 +512,61 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.1.0", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "az" version = "1.2.1" @@ -541,6 +594,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + [[package]] name = "base64" version = "0.12.3" @@ -555,9 +614,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -567,9 +626,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "basic-cookies" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb53b6b315f924c7f113b162e53b3901c05fc9966baf84d201dfcc7432a4bb38" +checksum = "67bd8fd42c16bdb08688243dc5f0cc117a3ca9efeeaba3a345a18a6159ad96f7" dependencies = [ "lalrpop", "lalrpop-util", @@ -614,9 +673,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "blake2" @@ -653,12 +712,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel 2.1.1", - "async-lock 3.1.2", + "async-channel 2.2.0", + "async-lock 3.3.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "piper", "tracing", ] @@ -698,9 +757,9 @@ checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" [[package]] name = "byteorder" @@ -720,12 +779,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" -[[package]] -name = "castaway" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" - [[package]] name = "cc" version = "1.0.83" @@ -768,9 +821,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -778,14 +831,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -794,18 +847,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 1.8.2", + "half 2.3.1", ] [[package]] @@ -819,11 +872,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ckb-merkle-mountain-range" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15193decfa1e0b151ce19e42d118db048459a27720fb3de7d3103c30adccb12" +dependencies = [ + "cfg-if", +] + [[package]] name = "clap" -version = "4.4.10" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" +checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" dependencies = [ "clap_builder", "clap_derive", @@ -831,33 +893,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.9" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" +checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "cli-table" @@ -884,7 +946,7 @@ dependencies = [ [[package]] name = "client-mithril-stake-distribution" -version = "0.1.0" +version = "0.1.6" dependencies = [ "anyhow", "mithril-client", @@ -896,7 +958,7 @@ dependencies = [ [[package]] name = "client-snapshot" -version = "0.1.0" +version = "0.1.6" dependencies = [ "anyhow", "async-trait", @@ -937,9 +999,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] @@ -965,28 +1027,38 @@ dependencies = [ [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", ] [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -994,9 +1066,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core2" @@ -1009,18 +1081,33 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -1038,7 +1125,7 @@ dependencies = [ "criterion-plot", "futures", "is-terminal", - "itertools", + "itertools 0.10.5", "num-traits", "once_cell", "oorandom", @@ -1060,51 +1147,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -1169,42 +1247,11 @@ dependencies = [ "cipher", ] -[[package]] -name = "curl" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" -dependencies = [ - "curl-sys", - "libc", - "openssl-probe", - "openssl-sys", - "schannel", - "socket2 0.4.10", - "winapi", -] - -[[package]] -name = "curl-sys" -version = "0.4.68+curl-8.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a0d18d88360e374b16b2273c832b5e57258ffc1d4aa4f96b108e0738d5752f" -dependencies = [ - "cc", - "libc", - "libnghttp2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "windows-sys 0.48.0", -] - [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -1225,14 +1272,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" dependencies = [ "darling_core", "darling_macro", @@ -1240,27 +1287,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.39", + "strsim 0.10.0", + "syn 2.0.48", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" dependencies = [ "darling_core", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1315,9 +1362,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", @@ -1329,12 +1376,6 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - [[package]] name = "digest" version = "0.9.0" @@ -1355,15 +1396,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -dependencies = [ - "dirs-sys", -] - [[package]] name = "dirs-next" version = "2.0.0" @@ -1374,18 +1406,6 @@ dependencies = [ "dirs-sys-next", ] -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1405,7 +1425,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1445,9 +1465,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", @@ -1460,9 +1480,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "ena" @@ -1497,7 +1517,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1508,9 +1528,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.3.31" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7" dependencies = [ "serde", ] @@ -1544,9 +1564,20 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.0" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" dependencies = [ "concurrent-queue", "parking", @@ -1559,7 +1590,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 4.0.0", + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.0.0", "pin-project-lite", ] @@ -1590,27 +1631,27 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall", + "windows-sys 0.52.0", ] [[package]] name = "fixed" -version = "1.24.0" +version = "1.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c69ce7e7c0f17aa18fdd9d0de39727adb9c6281f2ad12f57cbe54ae6e76e7d" +checksum = "e29e5681dc8556fb9df1409e95eae050e12e8776394313da3546dcb8cf390c73" dependencies = [ "az", "bytemuck", @@ -1634,15 +1675,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - [[package]] name = "flume" version = "0.11.0" @@ -1713,9 +1745,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1738,9 +1770,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1748,15 +1780,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1766,9 +1798,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -1787,27 +1819,26 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" dependencies = [ "fastrand 2.0.1", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", ] [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1822,15 +1853,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-ticker" @@ -1851,9 +1882,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1879,9 +1910,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1926,27 +1957,46 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19c5c67d8c29fe87e3266e691dd60948e6e4df4496c53355ef3551142945721b" +checksum = "362a6cc3cbe9f41aebe49c03b91aee8fa8fc69d32fb90533f6ed965a882e08e3" dependencies = [ "libc", - "windows-sys 0.42.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "h2" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.11", + "indexmap 2.2.3", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] name = "h2" -version = "0.3.22" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.1.0", + "http 1.0.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1975,7 +2025,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] @@ -1984,7 +2034,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.8", "allocator-api2", ] @@ -1994,10 +2044,10 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bytes", "headers-core", - "http", + "http 0.2.11", "httpdate", "mime", "sha1", @@ -2009,7 +2059,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" dependencies = [ - "http", + "http 0.2.11", ] [[package]] @@ -2029,9 +2079,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3" [[package]] name = "hex" @@ -2093,9 +2143,9 @@ dependencies = [ [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -2132,13 +2182,47 @@ dependencies = [ ] [[package]] -name = "http-body" -version = "0.4.5" +name = "http" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.11", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.0.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" dependencies = [ "bytes", - "http", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -2156,20 +2240,20 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "httpmock" -version = "0.6.8" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b02e044d3b4c2f94936fb05f9649efa658ca788f44eb6b87554e2033fc8ce93" +checksum = "08ec9586ee0910472dec1a1f0f8acf52f0fdde93aea74d70d4a3107b4be0fd5b" dependencies = [ "assert-json-diff", "async-object-pool", + "async-std", "async-trait", - "base64 0.21.5", + "base64 0.21.7", "basic-cookies", "crossbeam-utils", "form_urlencoded", "futures-util", - "hyper", - "isahc", + "hyper 0.14.28", "lazy_static", "levenshtein", "log", @@ -2193,28 +2277,47 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.2", + "http 1.0.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "tokio", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -2222,24 +2325,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.28", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "hyper 1.1.0", + "pin-project-lite", + "socket2 0.5.5", + "tokio", +] + [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -2293,7 +2412,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" dependencies = [ - "async-io 2.2.1", + "async-io 2.3.1", "core-foundation", "fnv", "futures", @@ -2308,16 +2427,16 @@ dependencies = [ [[package]] name = "igd-next" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e065e90a518ab5fedf79aa1e4b784e10f8e484a834f6bda85c42633a2cb7af" +checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4" dependencies = [ "async-trait", "attohttpc", "bytes", "futures", - "http", - "hyper", + "http 0.2.11", + "hyper 0.14.28", "log", "rand", "tokio", @@ -2338,9 +2457,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2349,9 +2468,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", "instant", @@ -2381,9 +2500,9 @@ dependencies = [ [[package]] name = "inventory" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0508c56cfe9bfd5dfeb0c22ab9a6abfda2f27bdca422132e494266351ed8d83c" +checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" [[package]] name = "io-lifetimes" @@ -2391,7 +2510,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.5", "libc", "windows-sys 0.48.0", ] @@ -2416,40 +2535,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.25", - "windows-sys 0.48.0", -] - -[[package]] -name = "isahc" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" -dependencies = [ - "async-channel 1.9.0", - "castaway", - "crossbeam-utils", - "curl", - "curl-sys", - "encoding_rs", - "event-listener 2.5.3", - "futures-lite 1.13.0", - "http", - "log", - "mime", - "once_cell", - "polling 2.8.0", - "slab", - "sluice", - "tracing", - "tracing-futures", - "url", - "waker-fn", + "hermit-abi 0.3.5", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -2470,26 +2562,35 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -2511,9 +2612,9 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.8", "anyhow", - "base64 0.21.5", + "base64 0.21.7", "bytecount", "clap", "fancy-regex", @@ -2551,9 +2652,9 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -2583,20 +2684,21 @@ dependencies = [ [[package]] name = "lalrpop" -version = "0.19.12" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" dependencies = [ "ascii-canvas", "bit-set", "diff", "ena", "is-terminal", - "itertools", + "itertools 0.10.5", "lalrpop-util", "petgraph", + "pico-args", "regex", - "regex-syntax 0.6.29", + "regex-syntax 0.7.5", "string_cache", "term", "tiny-keccak", @@ -2605,9 +2707,9 @@ dependencies = [ [[package]] name = "lalrpop-util" -version = "0.19.12" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" dependencies = [ "regex", ] @@ -2626,9 +2728,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -2636,21 +2738,11 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libnghttp2-sys" -version = "0.1.8+1.55.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fae956c192dadcdb5dace96db71fa0b827333cce7c7b38dc71446f024d8a340" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "libp2p" -version = "0.53.1" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1252a34c693386829c34d44ccfbce86679d2a9a2c61f582863649bbf57f26260" +checksum = "681fb3f183edfbedd7a57d32ebe5dcdc0b9f94061185acf3c30249349cc6fc99" dependencies = [ "bytes", "either", @@ -2696,9 +2788,9 @@ dependencies = [ [[package]] name = "libp2p-connection-limits" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2af4b1e1a1d6c5005a59b42287c0a526bcce94d8d688e2e9233b18eb843ceb4" +checksum = "c7cd50a78ccfada14de94cbacd3ce4b0138157f376870f13d3a8422cd075b4fd" dependencies = [ "libp2p-core", "libp2p-identity", @@ -2708,9 +2800,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.41.1" +version = "0.41.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c61b924474cf2c7edccca306693e798d797b85d004f4fef5689a7a3e6e8fe5" +checksum = "8130a8269e65a2554d55131c770bdf4bcd94d2b8d4efb24ca23699be65066c05" dependencies = [ "either", "fnv", @@ -2730,7 +2822,7 @@ dependencies = [ "smallvec", "thiserror", "tracing", - "unsigned-varint", + "unsigned-varint 0.8.0", "void", ] @@ -2752,12 +2844,12 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.46.0" +version = "0.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201f0626acd8985fae7fdd318e86c954574b9eef2e5dec433936a19a0338393d" +checksum = "d665144a616dadebdc5fff186b1233488cdcd8bfb1223218ff084b6d052c94f7" dependencies = [ - "asynchronous-codec 0.6.2", - "base64 0.21.5", + "asynchronous-codec", + "base64 0.21.7", "byteorder", "bytes", "either", @@ -2778,17 +2870,16 @@ dependencies = [ "sha2", "smallvec", "tracing", - "unsigned-varint", "void", ] [[package]] name = "libp2p-identify" -version = "0.44.0" +version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0544703553921214556f7567278b4f00cdd5052d29b0555ab88290cbfe54d81c" +checksum = "20499a945d2f0221fdc6269b3848892c0f370d2ee3e19c7f65a29d8f860f6126" dependencies = [ - "asynchronous-codec 0.6.2", + "asynchronous-codec", "either", "futures", "futures-bounded", @@ -2825,16 +2916,17 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.45.1" +version = "0.45.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd9ae9180fbe425f14e5558b0dfcb3ae8a76075b0eefb7792076902fbb63a14" +checksum = "5cc5767727d062c4eac74dd812c998f0e488008e82cce9c33b463d38423f9ad2" dependencies = [ "arrayvec", - "asynchronous-codec 0.6.2", + "asynchronous-codec", "bytes", "either", "fnv", "futures", + "futures-bounded", "futures-timer", "instant", "libp2p-core", @@ -2848,7 +2940,6 @@ dependencies = [ "thiserror", "tracing", "uint", - "unsigned-varint", "void", ] @@ -2898,7 +2989,7 @@ version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecd0545ce077f6ea5434bcb76e8d0fe942693b4380aaad0d34a358c2bd05793" dependencies = [ - "asynchronous-codec 0.7.0", + "asynchronous-codec", "bytes", "curve25519-dalek", "futures", @@ -2952,9 +3043,9 @@ dependencies = [ [[package]] name = "libp2p-quic" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02570b9effbc7c33331803104a8e9e53af7f2bdb4a2b61be420d6667545a0f5" +checksum = "a0375cdfee57b47b313ef1f0fdb625b78aed770d33a40cf1c294a371ff5e6666" dependencies = [ "bytes", "futures", @@ -2976,9 +3067,9 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.44.0" +version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643ce11d87db56387631c9757b61b83435b434f94dc52ec267c1666e560e78b0" +checksum = "e92532fc3c4fb292ae30c371815c9b10103718777726ea5497abc268a4761866" dependencies = [ "either", "fnv", @@ -2999,14 +3090,14 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" -version = "0.34.0" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b27d257436d01433a21da8da7688c83dba35826726161a328ff0989cd7af2dd" +checksum = "b644268b4acfdaa6a6100b31226ee7a36d96ab4c43287d113bfd2308607d8b6f" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3047,9 +3138,9 @@ dependencies = [ [[package]] name = "libp2p-upnp" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963eb8a174f828f6a51927999a9ab5e45dfa9aa2aa5fed99aa65f79de6229464" +checksum = "b49cc89949bf0e06869297cd4fe2c132358c23fe93e76ad43950453df4da3d35" dependencies = [ "futures", "futures-timer", @@ -3063,15 +3154,17 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.45.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "751f4778f71bc3db1ccf2451e7f4484463fec7f00c1ac2680e39c8368c23aae8" +checksum = "200cbe50349a44760927d50b431d77bed79b9c0a3959de1af8d24a63434b71e5" dependencies = [ + "either", "futures", "libp2p-core", "thiserror", "tracing", - "yamux", + "yamux 0.12.1", + "yamux 0.13.1", ] [[package]] @@ -3080,21 +3173,9 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", - "redox_syscall 0.4.1", -] - -[[package]] -name = "libz-sys" -version = "1.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "redox_syscall", ] [[package]] @@ -3111,9 +3192,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -3136,9 +3217,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" dependencies = [ "hashbrown 0.14.3", ] @@ -3159,19 +3240,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] -name = "memchr" -version = "2.6.4" +name = "matchit" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] -name = "memoffset" -version = "0.9.0" +name = "memchr" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -3191,9 +3269,9 @@ dependencies = [ [[package]] name = "minicbor" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7005aaf257a59ff4de471a9d5538ec868a21586534fff7f85dd97d4043a6139" +checksum = "9d15f4203d71fdf90903c2696e55426ac97a363c67b218488a73b534ce7aca10" dependencies = [ "half 1.8.2", "minicbor-derive", @@ -3218,18 +3296,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", @@ -3238,7 +3316,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.4.19" +version = "0.4.36" dependencies = [ "anyhow", "async-trait", @@ -3250,6 +3328,7 @@ dependencies = [ "hex", "httpmock", "mithril-common", + "mithril-persistence", "mockall", "openssl", "openssl-probe", @@ -3276,9 +3355,30 @@ dependencies = [ "zstd", ] +[[package]] +name = "mithril-aggregator-fake" +version = "0.1.3" +dependencies = [ + "anyhow", + "axum", + "clap", + "clap_derive", + "futures", + "mithril-common", + "reqwest", + "serde_json", + "signal-hook", + "signal-hook-tokio", + "tokio", + "tower-http", + "tracing", + "tracing-subscriber", + "warp", +] + [[package]] name = "mithril-client" -version = "0.5.11" +version = "0.6.1" dependencies = [ "anyhow", "async-recursion", @@ -3295,84 +3395,92 @@ dependencies = [ "reqwest", "semver", "serde", - "serde-wasm-bindgen", "serde_json", "slog", "slog-async", "slog-scope", "slog-term", + "strum", "tar", "thiserror", "tokio", "uuid", "warp", - "wasm-bindgen", - "wasm-bindgen-futures", "zstd", ] [[package]] name = "mithril-client-cli" -version = "0.5.8" +version = "0.5.19" dependencies = [ "anyhow", - "async-recursion", "async-trait", "chrono", "clap", "cli-table", "config", - "directories", - "flate2", - "flume", "fs2", "futures", - "hex", - "httpmock", "human_bytes", "indicatif", + "mithril-client", "mithril-common", - "mockall", "openssl", "openssl-probe", - "reqwest", - "semver", "serde", "serde_json", "slog", "slog-async", + "slog-bunyan", "slog-scope", "slog-term", - "tar", "thiserror", "tokio", - "warp", - "zstd", +] + +[[package]] +name = "mithril-client-wasm" +version = "0.1.9" +dependencies = [ + "async-trait", + "futures", + "mithril-client", + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", + "web-sys", ] [[package]] name = "mithril-common" -version = "0.2.144" +version = "0.3.1" dependencies = [ "anyhow", "async-trait", "bech32", "blake2 0.10.6", "chrono", + "ckb-merkle-mountain-range", "criterion", "digest 0.10.7", "ed25519-dalek", "fixed", "glob", "hex", - "http", "jsonschema", "kes-summed-ed25519", + "minicbor", "mithril-stm", "mockall", "nom", + "pallas-addresses", "pallas-codec", + "pallas-crypto", "pallas-network", + "pallas-primitives", + "pallas-traverse", "rand_chacha", "rand_core 0.6.4", "rayon", @@ -3382,14 +3490,13 @@ dependencies = [ "serde_bytes", "serde_cbor", "serde_json", - "serde_with 3.4.0", + "serde_with 3.6.1", "serde_yaml", "sha2", "slog", "slog-async", "slog-scope", "slog-term", - "sqlite", "strum", "thiserror", "tokio", @@ -3400,7 +3507,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.2.27" +version = "0.2.38" dependencies = [ "anyhow", "async-recursion", @@ -3423,9 +3530,32 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "mithril-persistence" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "hex", + "mithril-common", + "mockall", + "semver", + "serde", + "serde_json", + "sha2", + "slog", + "slog-async", + "slog-scope", + "slog-term", + "sqlite", + "thiserror", + "tokio", +] + [[package]] name = "mithril-relay" -version = "0.1.5" +version = "0.1.9" dependencies = [ "anyhow", "clap", @@ -3448,7 +3578,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.97" +version = "0.2.107" dependencies = [ "anyhow", "async-trait", @@ -3457,6 +3587,7 @@ dependencies = [ "hex", "httpmock", "mithril-common", + "mithril-persistence", "mockall", "openssl", "openssl-probe", @@ -3477,7 +3608,7 @@ dependencies = [ [[package]] name = "mithril-stm" -version = "0.3.11" +version = "0.3.15" dependencies = [ "bincode", "blake2 0.10.6", @@ -3500,9 +3631,9 @@ dependencies = [ [[package]] name = "mithrildemo" -version = "0.1.24" +version = "0.1.29" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "blake2 0.10.6", "clap", "hex", @@ -3517,9 +3648,9 @@ dependencies = [ [[package]] name = "mockall" -version = "0.11.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48" dependencies = [ "cfg-if", "downcast", @@ -3532,14 +3663,14 @@ dependencies = [ [[package]] name = "mockall_derive" -version = "0.11.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2" dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -3551,7 +3682,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 0.2.11", "httparse", "log", "memchr", @@ -3575,7 +3706,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.7.2", "url", ] @@ -3597,7 +3728,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" dependencies = [ "core2", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -3611,7 +3742,7 @@ dependencies = [ "log", "pin-project", "smallvec", - "unsigned-varint", + "unsigned-varint 0.7.2", ] [[package]] @@ -3741,10 +3872,14 @@ dependencies = [ ] [[package]] -name = "normalize-line-endings" -version = "0.3.0" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] [[package]] name = "num" @@ -3790,28 +3925,33 @@ checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -3832,9 +3972,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -3846,7 +3986,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.5", "libc", ] @@ -3867,9 +4007,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -3885,9 +4025,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -3903,11 +4043,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "foreign-types", "libc", @@ -3924,7 +4064,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3935,18 +4075,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.6+3.1.4" +version = "300.2.3+3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" +checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -3955,12 +4095,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - [[package]] name = "ordered-multimap" version = "0.4.3" @@ -3971,11 +4105,33 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pallas-addresses" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7015bf4b1770b7e2ce8c9742d7c798db540914562e67e22953eff4b6d53aab90" +dependencies = [ + "base58", + "bech32", + "crc", + "hex", + "pallas-codec", + "pallas-crypto", + "sha3", + "thiserror", +] + [[package]] name = "pallas-codec" -version = "0.20.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443cc4e8d59a8845282a8d35c4021a434a1911d3bc82914c3a8fcda8247d1ae" +checksum = "b9f8d41f17000f9a6bab7c26c99b19038a12de5cf004e901e1d0f5fa993e3d7d" dependencies = [ "hex", "minicbor", @@ -3985,32 +4141,66 @@ dependencies = [ [[package]] name = "pallas-crypto" -version = "0.20.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1116c3da7bc5ae8aa3a87a3ccc42a46d07994458d084c7d3c1dc732320bfc0" +checksum = "6610d24e42fe2d8408022bda788ba4bf6d125debe3da404e2499848e108788a1" dependencies = [ "cryptoxide", "hex", "pallas-codec", "rand_core 0.6.4", "serde", - "thiserror", + "thiserror", +] + +[[package]] +name = "pallas-network" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e581074044a45f6d65445b3796dd283fa513f13cf95412784a884da7bab4524e" +dependencies = [ + "byteorder", + "hex", + "itertools 0.12.1", + "pallas-codec", + "pallas-crypto", + "rand", + "socket2 0.5.5", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "pallas-primitives" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c1d8c016d49522e0de0b6839abeb0dbd2eb7de5353931d785ddc2cfe189d8a" +dependencies = [ + "base58", + "bech32", + "hex", + "log", + "pallas-codec", + "pallas-crypto", + "serde", + "serde_json", ] [[package]] -name = "pallas-network" -version = "0.20.0" +name = "pallas-traverse" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d5fb0899c37f74b2b3366d44eef85d44aea2b1cd8e9548263977baa252d9f4" +checksum = "2a92e50d84b029e069c9d6e36b38b1da2b5fe427c75a066697c8636e30dc9163" dependencies = [ - "byteorder", "hex", - "itertools", + "pallas-addresses", "pallas-codec", "pallas-crypto", + "pallas-primitives", + "paste", + "serde", "thiserror", - "tokio", - "tracing", ] [[package]] @@ -4037,7 +4227,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall", "smallvec", "windows-targets 0.48.5", ] @@ -4067,11 +4257,11 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3163d2912b7c3b52d651a055f2c7eec9ba5cd22d26ef75b8dd3a59980b185923" +checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "serde", ] @@ -4083,9 +4273,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.5" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" dependencies = [ "memchr", "thiserror", @@ -4094,9 +4284,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.5" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" dependencies = [ "pest", "pest_generator", @@ -4104,22 +4294,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.5" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "pest_meta" -version = "2.7.5" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" dependencies = [ "once_cell", "pest", @@ -4133,7 +4323,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] @@ -4145,24 +4335,30 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -4200,15 +4396,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platforms" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "plotters" @@ -4256,14 +4452,14 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.25", + "rustix 0.38.31", "tracing", "windows-sys 0.52.0", ] @@ -4293,9 +4489,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "powerfmt" @@ -4317,16 +4513,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "predicates" -version = "2.1.5" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" dependencies = [ - "difflib", - "float-cmp", - "itertools", - "normalize-line-endings", + "anstyle", "predicates-core", - "regex", ] [[package]] @@ -4347,18 +4539,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "prometheus-client" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510c4f1c9d81d556458f94c98f857748130ea9737bbd6053da497503b26ea63c" +checksum = "6f87c10af16e0af74010d2a123d202e8363c04db5acfa91d8747f64a8524da3a" dependencies = [ "dtoa", "itoa", @@ -4374,7 +4566,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -4385,7 +4577,7 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "lazy_static", "num-traits", "rand", @@ -4414,15 +4606,15 @@ dependencies = [ [[package]] name = "quick-protobuf-codec" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ededb1cd78531627244d51dd0c7139fbe736c7d57af0092a76f0ffb2f56e98" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" dependencies = [ - "asynchronous-codec 0.6.2", + "asynchronous-codec", "bytes", "quick-protobuf", "thiserror", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] @@ -4475,9 +4667,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -4529,9 +4721,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -4539,9 +4731,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -4553,21 +4745,12 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52c4f3084aa3bc7dfbba4eff4fab2a54db4324965d8872ab933565e6fbd83bc6" dependencies = [ - "pem 3.0.2", + "pem 3.0.3", "ring 0.16.20", "time", "yasna", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -4590,9 +4773,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -4602,9 +4785,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -4613,9 +4796,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" @@ -4625,19 +4808,19 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-tls", "ipnet", "js-sys", @@ -4647,9 +4830,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -4690,9 +4875,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.6" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", "getrandom", @@ -4730,13 +4915,14 @@ dependencies = [ [[package]] name = "rug" -version = "1.22.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a118f8296241f6952511e8f9ab5b8a759c0d9ed902159b0aeed82d902e84ca6" +checksum = "76a82fd85950d103ad075f104d10c77d71640830c6a959a418380be380eaf7cd" dependencies = [ "az", "gmp-mpfr-sys", "libc", + "libm", ] [[package]] @@ -4795,25 +4981,25 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", - "linux-raw-sys 0.4.11", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.6", + "ring 0.17.7", "rustls-webpki", "sct", ] @@ -4824,7 +5010,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] [[package]] @@ -4833,7 +5019,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.6", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -4868,9 +5054,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "salsa20" @@ -4892,11 +5078,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4917,7 +5103,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.6", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -4946,24 +5132,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde-wasm-bindgen" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ba92964781421b6cef36bf0d7da26d201e96d84e1b10e7ae6ed416e516906d" +checksum = "b9b713f70513ae1f8d92665bbbbda5c295c2cf1da5542881ae5eefe20c9af132" dependencies = [ "js-sys", "serde", @@ -4972,9 +5158,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.12" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ "serde", ] @@ -4991,26 +5177,36 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_regex" version = "1.1.0" @@ -5051,18 +5247,19 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", + "serde_derive", "serde_json", - "serde_with_macros 3.4.0", + "serde_with_macros 3.6.1", "time", ] @@ -5075,28 +5272,28 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -5135,6 +5332,25 @@ dependencies = [ "keccak", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -5144,6 +5360,18 @@ dependencies = [ "libc", ] +[[package]] +name = "signal-hook-tokio" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213241f76fb1e37e27de3b6aa1b068a2c333233b59cca6634f634b80a27ecf1e" +dependencies = [ + "futures-core", + "libc", + "signal-hook", + "tokio", +] + [[package]] name = "signature" version = "2.2.0" @@ -5155,9 +5383,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aeaf503862c419d66959f5d7ca015337d864e9c49485d771b732e2a20453597" +checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" [[package]] name = "simple_asn1" @@ -5205,9 +5433,9 @@ dependencies = [ [[package]] name = "slog-bunyan" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440fd32d0423c31e4f98d76c0b62ebdb847f905aa07357197e9b41ac620af97d" +checksum = "dcaaf6e68789d3f0411f1e72bc443214ef252a1038b6e344836e50442541f190" dependencies = [ "hostname", "slog", @@ -5251,35 +5479,24 @@ dependencies = [ "time", ] -[[package]] -name = "sluice" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" -dependencies = [ - "async-channel 1.9.0", - "futures-core", - "futures-io", -] - [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "snow" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58021967fd0a5eeeb23b08df6cc244a4d4a5b4aec1d27c9e02fad1a58b4cd74e" +checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" dependencies = [ "aes-gcm", "blake2 0.10.6", "chacha20poly1305", "curve25519-dalek", "rand_core 0.6.4", - "ring 0.17.6", + "ring 0.17.7", "rustc_version", "sha2", "subtle", @@ -5332,9 +5549,9 @@ dependencies = [ [[package]] name = "sqlite" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03801c10193857d6a4a71ec46cee198a15cbc659622aabe1db0d0bdbefbcf8e6" +checksum = "78a97f6ee5b054b7cfddc3b6613fdea4c77af2ef8f8aac3048c7d0be31e605e3" dependencies = [ "libc", "sqlite3-sys", @@ -5342,9 +5559,9 @@ dependencies = [ [[package]] name = "sqlite3-src" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc95a51a1ee38839599371685b9d4a926abb51791f0bc3bf8c3bb7867e6e454" +checksum = "9448d45899495acd1a46b0b888ae9747c13551fb0d8f4a60ab485da52b040503" dependencies = [ "cc", "pkg-config", @@ -5352,9 +5569,9 @@ dependencies = [ [[package]] name = "sqlite3-sys" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2752c669433e40ebb08fde824146f50d9628aa0b66a3b7fc6be34db82a8063b" +checksum = "aed0b61828382e1103930d2d5df1972d493173319730b481192e63d929097321" dependencies = [ "libc", "sqlite3-src", @@ -5385,26 +5602,32 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "strum" -version = "0.25.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "723b93e8addf9aa965ebe2d11da6d7540fa2283fcea14b3371ff055f7ba13f5f" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "7a3417fc93d76740d974a01654a09777cb500428cc874ca9f45edfe0c4d4cd18" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5426,15 +5649,21 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" @@ -5487,15 +5716,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall 0.4.1", - "rustix 0.38.25", - "windows-sys 0.48.0", + "rustix 0.38.31", + "windows-sys 0.52.0", ] [[package]] @@ -5511,9 +5739,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -5526,22 +5754,22 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5565,13 +5793,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -5587,10 +5816,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -5630,9 +5860,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -5655,7 +5885,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5714,6 +5944,45 @@ dependencies = [ "serde", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" +dependencies = [ + "bitflags 2.4.2", + "bytes", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -5740,7 +6009,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5750,23 +6019,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", ] [[package]] -name = "tracing-futures" -version = "0.2.5" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "pin-project", - "tracing", + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" @@ -5777,7 +6062,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.11", "httparse", "log", "rand", @@ -5795,9 +6080,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "typetag" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80960fd143d4c96275c0e60b08f14b81fbb468e79bc0ef8fbda69fb0afafae43" +checksum = "c43148481c7b66502c48f35b8eef38b6ccdc7a9f04bd4cc294226d901ccc9bc7" dependencies = [ "erased-serde", "inventory", @@ -5808,13 +6093,13 @@ dependencies = [ [[package]] name = "typetag-impl" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc13d450dc4a695200da3074dacf43d449b968baee95e341920e47f61a3b40f" +checksum = "291db8a81af4840c10d636e047cac67664e343be44e24dfdbd1492df9a5d3390" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5852,9 +6137,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -5895,19 +6180,21 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "unsigned-varint" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" -dependencies = [ - "asynchronous-codec 0.6.2", - "bytes", -] + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" [[package]] name = "untrusted" @@ -5946,9 +6233,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "getrandom", "rand", @@ -5957,20 +6244,26 @@ dependencies = [ [[package]] name = "uuid-macro-internal" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49e7f3f3db8040a100710a11932239fd30697115e2ba4107080d8252939845e" +checksum = "7abb14ae1a50dad63eaa768a458ef43d298cd1bd44951677bd10b732a9ba2a2d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "value-bag" -version = "1.4.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b" [[package]] name = "vcpkg" @@ -6034,8 +6327,8 @@ dependencies = [ "futures-channel", "futures-util", "headers", - "http", - "hyper", + "http 0.2.11", + "hyper 0.14.28", "log", "mime", "mime_guess", @@ -6063,9 +6356,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -6073,24 +6366,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -6100,9 +6393,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6110,28 +6403,53 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143ddeb4f833e2ed0d252e618986e18bfc7b0e52f2d28d77d05b2f045dd8eb61" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5211b7550606857312bba1d978a8ec75692eae187becc5e680444fffc5e6f89" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -6142,9 +6460,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -6193,7 +6511,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-core", + "windows-core 0.51.1", "windows-targets 0.48.5", ] @@ -6207,27 +6525,12 @@ dependencies = [ ] [[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.52.0", ] [[package]] @@ -6248,21 +6551,6 @@ dependencies = [ "windows-targets 0.52.0", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -6293,12 +6581,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.0", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6311,12 +6593,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -6329,12 +6605,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -6347,12 +6617,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -6365,12 +6629,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -6383,12 +6641,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -6401,12 +6653,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -6431,9 +6677,9 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core 0.6.4", @@ -6460,11 +6706,13 @@ dependencies = [ [[package]] name = "xattr" -version = "1.0.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", + "linux-raw-sys 0.4.13", + "rustix 0.38.31", ] [[package]] @@ -6506,6 +6754,22 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "yamux" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1d0148b89300047e72994bee99ecdabd15a9166a7b70c8b8c37c314dcc9002" +dependencies = [ + "futures", + "instant", + "log", + "nohash-hasher", + "parking_lot", + "pin-project", + "rand", + "static_assertions", +] + [[package]] name = "yasna" version = "0.5.2" @@ -6517,22 +6781,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.26" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.26" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -6552,7 +6816,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index db1c2a44014..ce2c2262b9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,15 +9,18 @@ members = [ "mithril-aggregator", "mithril-client", "mithril-client-cli", + "mithril-client-wasm", "mithril-common", + "mithril-persistence", "mithril-relay", "mithril-signer", "mithril-stm", + "mithril-test-lab/mithril-aggregator-fake", "mithril-test-lab/mithril-end-to-end", ] [workspace.package] -authors = ["dev@iohk.io"] +authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" homepage = "https://mithril.network" diff --git a/Makefile b/Makefile index 82c53544212..0ffd8ee21ca 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -COMPONENTS = mithril-common mithril-stm mithril-aggregator mithril-client mithril-client-cli mithril-signer demo/protocol-demo mithril-test-lab/mithril-end-to-end +COMPONENTS = mithril-common mithril-persistence mithril-stm mithril-aggregator mithril-client mithril-client-cli mithril-signer demo/protocol-demo mithril-test-lab/mithril-end-to-end GOALS := $(or $(MAKECMDGOALS),all) .PHONY: $(GOALS) $(COMPONENTS) diff --git a/README.md b/README.md index 48d8af7f4f4..537685634f6 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,11 @@ This repository consists of the following parts: * [**Mithril client CLI**](./mithril-client-cli): the CLI used for retrieving the certified artifacts produced by the **Mithril network**, eg the **Cardano** chain certified snapshots used to securely restore a **Cardano node**. +* [**Mithril client WASM**](./mithril-client-wasm): the WASM compatible library used for retrieving the certified artifacts produced by the **Mithril network**. + * [**Mithril common**](./mithril-common): this is the **common** library that is used by the **Mithril network** nodes. + +* [**Mithril persistence**](./mithril-persistence): the **persistence** library that is used by the **Mithril network** nodes. * [**Mithril STM**](./mithril-stm): the **core** library that implements **Mithril** protocol cryptographic engine. @@ -78,6 +82,8 @@ This repository consists of the following parts: * [**Protocol demonstration**](./demo/protocol-demo): a simple CLI that helps understand how the **Mithril** protocol works and the role of its **protocol parameters**. +* [**Examples**](./examples): out of the box working examples to get familiar with **Mithril**. + ## :bridge_at_night: Contributing The best way to contribute right now is to provide feedback. Start by giving a look at our [documentation](https://mithril.network/doc). diff --git a/demo/protocol-demo/Cargo.toml b/demo/protocol-demo/Cargo.toml index 25a8777f63a..8d574dc7b7d 100644 --- a/demo/protocol-demo/Cargo.toml +++ b/demo/protocol-demo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithrildemo" -version = "0.1.24" +version = "0.1.29" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } @@ -9,16 +9,16 @@ license = { workspace = true } repository = { workspace = true } [dependencies] -base64 = "0.21.4" +base64 = "0.21.7" blake2 = "0.10.6" -clap = { version = "4.4.6", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } hex = "0.4.3" log = "0.4.20" -mithril-common = { path = "../../mithril-common" } +mithril-common = { path = "../../mithril-common", features = ["fs"] } rand_chacha = "0.3.1" rand_core = "0.6.4" -serde = { version = "1.0.188", features = ["derive"] } -serde_json = "1.0.107" +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.113" [target.'cfg(not(windows))'.dependencies] # non-windows: use default rug backend diff --git a/docs/runbook/README.md b/docs/runbook/README.md index 203e417882b..98baca98049 100644 --- a/docs/runbook/README.md +++ b/docs/runbook/README.md @@ -19,4 +19,5 @@ This page gathers the available guides to operate a Mithril network. | **Upgrade VM of infrastructure** | [upgrade-vm](./upgrade-vm/README.md) | Upgrade the VM of the infrastructure of a Mithril network. | | **Create test Docker distribution** | [test-docker-distribution](./test-docker-distribution/README.md) | Create a custom test Docker distribution. | | **Deploy a test network manually** | [test-deploy-network](./test-deploy-network/README.md) | Manually deploy a test distribution to a test Mithril network. | -| **Publish crates to crates.io manually** | [manual-publish-crates](./manual-publish-crates/README.md) | Manually publish Rust crates to crates.io. | \ No newline at end of file +| **Publish crates to crates.io manually** | [manual-publish-crates](./manual-publish-crates/README.md) | Manually publish Rust crates to crates.io. | +| **Publish packages to npm manually** | [manual-publish-npm](./manual-publish-npm/README.md) | Manually publish packages to npm registry. | \ No newline at end of file diff --git a/docs/runbook/era-markers/README.md b/docs/runbook/era-markers/README.md index 6c1fbc28f85..4eba17d479f 100644 --- a/docs/runbook/era-markers/README.md +++ b/docs/runbook/era-markers/README.md @@ -25,6 +25,11 @@ $ export ERA_ACTIVATION_SECRET_KEY=**YOUR_ERA_ACTIVATION_SECRET_KEY** $ export ASSETS_PATH=**YOUR_ASSETS_PATH** ``` +Compute the current Cardano era: +```bash +CARDANO_ERA=$(cardano-cli query tip --testnet-magic $CARDANO_TESTNET_MAGIC | jq -r '.era |= ascii_downcase | .era') +``` + Set the transaction amount used when a script transaction is made: ```bash $ export SCRIPT_TX_VALUE=2000000 @@ -49,12 +54,12 @@ $ TX_IN=f0c0345f151f9365fbbb4e7afa217e56b987d9e91fd754ca609d9dfec97275c7#0 Create the initial datum file: ```bash -$ ./mithril-aggregator era generate-tx-datum --current-era-epoch 1 --era-markers-secret-key $ERA_ACTIVATION_SECRET_KEY > $ASSETS_PATH/mithril-era-datum-1.json +$ ./mithril-aggregator era generate-tx-datum --current-era-epoch 1 --era-markers-secret-key $ERA_ACTIVATION_SECRET_KEY --target-path $ASSETS_PATH/mithril-era-datum-1.json ``` Now create the bootstrap transaction with datum: ```bash -$ cardano-cli transaction build --babbage-era --testnet-magic $CARDANO_TESTNET_MAGIC \ +$ cardano-cli $CARDANO_ERA transaction build --testnet-magic $CARDANO_TESTNET_MAGIC \ --tx-in $TX_IN \ --tx-out $(cat $CARDANO_WALLET_PATH/payment.addr)+$SCRIPT_TX_VALUE \ --tx-out-inline-datum-file $ASSETS_PATH/mithril-era-datum-1.json \ @@ -65,7 +70,7 @@ Estimated transaction fee: Lovelace 168669 Then sign the transaction: ```bash -$ cardano-cli transaction sign \ +$ cardano-cli $CARDANO_ERA transaction sign \ --tx-body-file $ASSETS_PATH/tx.raw \ --signing-key-file $CARDANO_WALLET_PATH/payment.skey \ --testnet-magic $CARDANO_TESTNET_MAGIC \ @@ -74,7 +79,7 @@ $ cardano-cli transaction sign \ And submit it: ```bash -$ cardano-cli transaction submit \ +$ cardano-cli $CARDANO_ERA transaction submit \ --testnet-magic $CARDANO_TESTNET_MAGIC \ --tx-file $ASSETS_PATH/tx.signed Transaction successfully submitted. @@ -150,12 +155,12 @@ Create the updated datum file: :warning: The options provided in the following command are for example only, you need to use adequately the options of the `era generate-tx-datum` command, which will depend on the operation you want to execute: announce an upcoming era or activate an upcoming era. This operation should be done very cautiously as a misconfiguration can lead to disturbed service of the network. ```bash -$ ./mithril-aggregator era generate-tx-datum --current-era-epoch 1 --era-markers-secret-key $ERA_ACTIVATION_SECRET_KEY > $ASSETS_PATH/mithril-era-datum-2.json +$ ./mithril-aggregator era generate-tx-datum --current-era-epoch 1 --era-markers-secret-key $ERA_ACTIVATION_SECRET_KEY --target-path $ASSETS_PATH/mithril-era-datum-2.json ``` Now create the update transaction with datum: ```bash -$ cardano-cli transaction build --babbage-era --testnet-magic $CARDANO_TESTNET_MAGIC \ +$ cardano-cli $CARDANO_ERA transaction build --testnet-magic $CARDANO_TESTNET_MAGIC \ --tx-in $TX_IN_DATUM \ --tx-in $TX_IN_NO_DATUM \ --tx-out $(cat $CARDANO_WALLET_PATH/payment.addr)+$SCRIPT_TX_VALUE \ @@ -167,7 +172,7 @@ Estimated transaction fee: Lovelace 179889 Then sign the transaction: ```bash -$ cardano-cli transaction sign \ +$ cardano-cli $CARDANO_ERA transaction sign \ --tx-body-file $ASSETS_PATH/tx.raw \ --signing-key-file $CARDANO_WALLET_PATH/payment.skey \ --testnet-magic $CARDANO_TESTNET_MAGIC \ @@ -176,7 +181,7 @@ $ cardano-cli transaction sign \ And submit it: ```bash -$ cardano-cli transaction submit \ +$ cardano-cli $CARDANO_ERA transaction submit \ --testnet-magic $CARDANO_TESTNET_MAGIC \ --tx-file $ASSETS_PATH/tx.signed Transaction successfully submitted. diff --git a/docs/runbook/manual-publish-crates/README.md b/docs/runbook/manual-publish-crates/README.md index fbe4e0a8d8f..620dbdfc72d 100644 --- a/docs/runbook/manual-publish-crates/README.md +++ b/docs/runbook/manual-publish-crates/README.md @@ -1,4 +1,4 @@ -Manually publish Rust crates to crates.io. +# Manually publish Rust crates to crates.io. ## Introduction diff --git a/docs/runbook/manual-publish-npm/README.md b/docs/runbook/manual-publish-npm/README.md new file mode 100644 index 00000000000..14a468a392a --- /dev/null +++ b/docs/runbook/manual-publish-npm/README.md @@ -0,0 +1,25 @@ +# Manually publish packages to npm registry. + +## Introduction + +From time to time, we may need to publish manually packages to [npm ristry](https://npmjs.com/) registry. + +## Run the associated 'Manual npm publication' GitHub Actions workflow + +Go to the page of the workflow with your browser: [Manual npm publication](https://github.com/input-output-hk/mithril/actions/workflows/manual-publish-npm.yml) + +Then, click on the **Run workflow** button: + +![Run workflow button](./img/run-workflow-button.png) + +Then fill the form to manually run the workflow: + +![Run workflow form](./img/run-workflow-form.png) + +> [!CAUTION] +> It is highly recommended to run with the **Dry run** option checked at first and make sure that the process works as expected. + + +The result should look like this in the GitHub Actions: + +![Run workflow result](./img/run-workflow-result.png) diff --git a/docs/runbook/manual-publish-npm/img/run-workflow-button.png b/docs/runbook/manual-publish-npm/img/run-workflow-button.png new file mode 100644 index 0000000000000000000000000000000000000000..a18b183c0adaaa161ba7594a24eebabc974d6fa8 GIT binary patch literal 77858 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 l_Avv)Y1`4t_ni{Uo7; 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 chmod +x mithril-signer* diff --git a/docs/website/blog/2023-11-27-mithril-client-library-released.md b/docs/website/blog/2023-11-27-mithril-client-library-released.md index 40611cee18c..03e9d8b921d 100644 --- a/docs/website/blog/2023-11-27-mithril-client-library-released.md +++ b/docs/website/blog/2023-11-27-mithril-client-library-released.md @@ -13,7 +13,7 @@ The **Mithril client library** allows developers to use all the tooling necessar Here are some useful documentation that can be used by developers: - **Developer documentation**: https://docs.rs/mithril-client/0.5.7/mithril_client/ -- **Example of implementations**:https://github.com/input-output-hk/mithril/blob/main/mithril-client/examples/ +- **Example of implementations**:https://github.com/input-output-hk/mithril/blob/main/examples/ - **Mithril client repository**: https://github.com/input-output-hk/mithril/tree/main/mithril-client - **Crates.io**: https://crates.io/crates/mithril-client diff --git a/docs/website/blog/2024-01-03-signer-service-new-configuration.md b/docs/website/blog/2024-01-03-signer-service-new-configuration.md new file mode 100644 index 00000000000..82e56e5df50 --- /dev/null +++ b/docs/website/blog/2024-01-03-signer-service-new-configuration.md @@ -0,0 +1,46 @@ +--- +title: Mithril signer service new configuration +authors: +- name: Mithril Team +tags: [spo, mithril signer, production] +--- + +### The Mithril signer node service recommended configuration is updated + +**PR**: `Fix signer service recommended configuration` [#1419](https://github.com/input-output-hk/mithril/pull/1419) + +**Issue**: `Fix signer node service setup` [#1404](https://github.com/input-output-hk/mithril/issues/1404) + +The previous recommended configuration proposed a service restart frequency which was too high. When the service was restarted, and if the Cardano node was not ready yet, the service tried to restart too many times in a short period: thus the service just failed and the service had to be started manually after the Cardano node is up and ready. This lead to some SPOs skipping registrations for some epochs. + +The duration before restarting the service is increased to 60s: `RestartSec=60`. + +Below is the new recommended configuration: + +``` +[Unit] +Description=Mithril signer service +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=always +RestartSec=60 +User=cardano +EnvironmentFile=/opt/mithril/mithril-signer.env +ExecStart=/opt/mithril/mithril-signer -vvv + +[Install] +WantedBy=multi-user.target +EOF' +``` + +We highly recommend to update your existing configuration file (`/etc/systemd/system/mithril-signer.service`) with the values specified in the [guide](https://mithril.network/doc/next/manual/getting-started/run-signer-node/#installing-the-service) + +:warning: Following this modification, the service needs to be restarted with the following command: + +```bash +sudo systemctl restart mithril-signer +``` + +Feel free to reach out to us on the [Discord channel](https://discord.gg/5kaErDKDRq) for questions and/or help. diff --git a/docs/website/blog/2024-01-23-mithril-client-npm-package-released.md b/docs/website/blog/2024-01-23-mithril-client-npm-package-released.md new file mode 100644 index 00000000000..353547ee673 --- /dev/null +++ b/docs/website/blog/2024-01-23-mithril-client-npm-package-released.md @@ -0,0 +1,19 @@ +--- +title: Mithril client npm package is released! +authors: + - name: Mithril Team +tags: [wasm, web assembly, mithril client, library, npm, registry] +--- + +### Mithril client npm is open to developers on npmjs.com + +The Mithril team has published the first release (**v0.1.7)** of its [mithril-client-wasm](https://www.npmjs.com/package/@mithril-dev/mithril-client-wasm) npm package on npmjs.com. + +The **Mithril client npm package** allows developers to use all the tooling necessary to manipulate Mithril certified types from a Mithril Aggregator directly in their (web) applications and to develop their own Mithril clients in any supported browser! + +Here are some useful documentation that can be used by developers: +- **Example of implementations**: https://mithril.network/doc/manual/developer-docs/nodes/mithril-client-library-wasm +- **Mithril client npm package repository**: https://github.com/input-output-hk/mithril/tree/main/mithril-client-wasm +- **npm**: https://www.npmjs.com/package/@mithril-dev/mithril-client-wasm + +Feel free to reach out to us on the [Discord channel](https://discord.gg/5kaErDKDRq) for questions and/or help. diff --git a/docs/website/blog/2024-02-08-testing-sanchonet-network-available.md b/docs/website/blog/2024-02-08-testing-sanchonet-network-available.md new file mode 100644 index 00000000000..9649488d28e --- /dev/null +++ b/docs/website/blog/2024-02-08-testing-sanchonet-network-available.md @@ -0,0 +1,20 @@ +--- +title: Mithril SanchoNet network released +authors: + - name: Mithril Team +tags: [cardano, sanchonet, spo, testing] +--- + +### The release of the Mithril SanchoNet testing network + +The Mithril team has released the new [`testing-sanchonet`](https://mithril.network/explorer/?aggregator=https%3A%2F%2Faggregator.testing-sanchonet.api.mithril.network%2Faggregator) Mithril network. + +Mithril pioneer stake pool operators (SPOs) are welcome to run a [Mithril signer](https://mithril.network/doc/next/manual/getting-started/run-signer-node) on this network, with configuration parameters available [here](https://mithril.network/doc/manual/developer-docs/references/#mithril-networks). + +It's important to note that this network will serve as the primary platform for experimenting with unstable features of the Mithril networks in the future, such as the Cardano transactions set signatures or peer-to-peer (P2P) networking. + +The unstable features are consistently developed and deployed to the SanchoNet testing network directly from the `main` branch of the Mithril repository. Therefore, Mithril nodes operating on this network must be either built from the `main` branch or use pre-built binaries from the [`unstable release`](https://github.com/input-output-hk/mithril/releases/tag/unstable). Failure to update Mithril nodes to the latest unstable version or encountering a bug during development could result in operational disruptions. + +Note that the `testing-sanchonet` network undergoes continuous monitoring, and its availability status is reported on this [status page](https://mithril.cronitorstatus.com/). + +For any inquiries or assistance, don't hesitate to reach out to the team on the [Discord channel](https://discord.gg/5kaErDKDRq). diff --git a/docs/website/package-lock.json b/docs/website/package-lock.json new file mode 100644 index 00000000000..79708dd3d29 --- /dev/null +++ b/docs/website/package-lock.json @@ -0,0 +1,14455 @@ +{ + "name": "mithril-doc", + "version": "0.1.33", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mithril-doc", + "version": "0.1.33", + "dependencies": { + "@docusaurus/core": "^3.1.1", + "@docusaurus/preset-classic": "^3.1.1", + "@docusaurus/theme-mermaid": "^3.1.1", + "clsx": "^2.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redocusaurus": "^2.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "license": "MIT" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz", + "integrity": "sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.5.1", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^4.2.2", + "cssnano": "^5.1.15", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^5.3.10", + "postcss": "^8.4.26", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "3.1.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/module-type-aliases/node_modules/react-helmet-async": { + "version": "2.0.4", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz", + "integrity": "sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/plugin-debug": "3.1.1", + "@docusaurus/plugin-google-analytics": "3.1.1", + "@docusaurus/plugin-google-gtag": "3.1.1", + "@docusaurus/plugin-google-tag-manager": "3.1.1", + "@docusaurus/plugin-sitemap": "3.1.1", + "@docusaurus/theme-classic": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-search-algolia": "3.1.1", + "@docusaurus/types": "3.1.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-mermaid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.1.1.tgz", + "integrity": "sha512-O6u9/7QX/ZapV4HJJSzNs0Jir1KA/LRLORWYeDvbGswqZNusj6q4iLELrKIClysJ3PB3zWUzyKtI/wjIKiV1vA==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "mermaid": "^10.4.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.1.1", + "@svgr/webpack": "^6.5.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz", + "integrity": "sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "license": "MIT" + }, + "node_modules/@redocly/ajv": { + "version": "8.11.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/openapi-core": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@types/node": "^14.11.8", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/@types/node": { + "version": "14.18.63", + "license": "MIT" + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "license": "MIT", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.4", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.13", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.48", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react/node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.16.2", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.17", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request/node_modules/mimic-response": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001581", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/core-js": { + "version": "3.35.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.35.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.10.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.28.1", + "license": "MIT", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.8.5", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "license": "MIT", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decko": { + "version": "1.2.0" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-redoc": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "1.4.0", + "redoc": "2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/utils": "^3.0.0" + } + }, + "node_modules/docusaurus-theme-redoc": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "1.4.0", + "clsx": "^1.2.1", + "copyfiles": "^2.4.1", + "lodash": "^4.17.21", + "mobx": "^6.10.2", + "redoc": "2.1.3", + "styled-components": "^6.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.0.0" + } + }, + "node_modules/docusaurus-theme-redoc/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.0.8", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.651", + "license": "ISC" + }, + "node_modules/elkjs": { + "version": "0.9.1", + "license": "EPL-2.0" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.0", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.2", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.2" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "license": "MIT" + }, + "node_modules/history": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-client": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.12.1", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "license": "MIT" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.6.0", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "10.7.0", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^6.0.1", + "@types/d3-scale": "^4.0.3", + "@types/d3-scale-chromatic": "^3.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "^3.0.5", + "elkjs": "^0.9.0", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/mermaid/node_modules/@types/mdast": { + "version": "3.0.15", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mermaid/node_modules/@types/unist": { + "version": "2.0.10", + "license": "MIT" + }, + "node_modules/mermaid/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "license": "MIT", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mermaid/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mermaid/node_modules/micromark": { + "version": "3.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mermaid/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-label": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-space": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-title": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mermaid/node_modules/micromark-util-character": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/mermaid/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mermaid/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mermaid/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mermaid/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-encode": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-encode": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.7", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mobx": { + "version": "6.12.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "7.6.0", + "license": "MIT", + "dependencies": { + "mobx-react-lite": "^3.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "3.4.3", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mri": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "license": "MIT" + }, + "node_modules/noms": { + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-sampler": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.7", + "json-pointer": "0.6.2" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "license": "MIT", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/periscopic": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.4.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-tabs": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "clsx": "^1.1.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-0 || ^18.0.0" + } + }, + "node_modules/react-tabs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redoc": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.0.0-rc.2", + "classnames": "^2.3.1", + "decko": "^1.2.0", + "dompurify": "^2.2.8", + "eventemitter3": "^4.0.7", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.0.15", + "mobx-react": "^7.2.0", + "openapi-sampler": "^1.3.1", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.1.3", + "prismjs": "^1.27.0", + "prop-types": "^15.7.2", + "react-tabs": "^4.3.0", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "swagger2openapi": "^7.0.6", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0", + "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" + } + }, + "node_modules/redoc/node_modules/@redocly/openapi-core": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/redoc/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/redoc/node_modules/dompurify": { + "version": "2.4.7", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/redoc/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/redocusaurus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.0.0.tgz", + "integrity": "sha512-wRSpkY+PwkqAj98RD+1ec6U8KDKySH6GT0jahWY+dPlpckyHj7D5i3ipXdTiJ6jXXCyM2qUwimX5PZJEdooDhA==", + "dependencies": { + "docusaurus-plugin-redoc": "2.0.0", + "docusaurus-theme-redoc": "2.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.0.0", + "@docusaurus/utils": "^3.0.0" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "license": "Unlicense" + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "license": "BSD-3-Clause" + }, + "node_modules/sade": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.18.0", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/should": { + "version": "13.2.3", + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.4.7", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy-transport/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "license": "MIT" + }, + "node_modules/stickyfill": { + "version": "1.1.1" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "6.1.8", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.1", + "@emotion/unitless": "0.8.0", + "@types/stylis": "4.2.0", + "css-to-react-native": "3.2.0", + "csstype": "3.1.2", + "postcss": "8.4.31", + "shallowequal": "1.1.0", + "stylis": "4.3.1", + "tslib": "2.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.5.0", + "license": "0BSD" + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.3.1", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-template": { + "version": "2.0.8", + "license": "BSD" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-worker": { + "version": "1.3.0", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.90.0", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/website/package.json b/docs/website/package.json index 40c7f92df80..b2b2e5c01b2 100644 --- a/docs/website/package.json +++ b/docs/website/package.json @@ -1,6 +1,6 @@ { "name": "mithril-doc", - "version": "0.1.29", + "version": "0.1.33", "private": true, "scripts": { "docusaurus": "docusaurus", @@ -14,11 +14,10 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.0.0", - "@docusaurus/preset-classic": "^3.0.0", - "@docusaurus/theme-mermaid": "^3.0.0", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.1.1", + "@docusaurus/core": "^3.1.1", + "@docusaurus/preset-classic": "^3.1.1", + "@docusaurus/theme-mermaid": "^3.1.1", + "clsx": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "redocusaurus": "^2.0.0" @@ -35,4 +34,4 @@ "last 1 safari version" ] } -} \ No newline at end of file +} diff --git a/docs/website/root/manual/developer-docs/nodes/mithril-aggregator.md b/docs/website/root/manual/developer-docs/nodes/mithril-aggregator.md index 4d38b0f9366..87c4b25c399 100644 --- a/docs/website/root/manual/developer-docs/nodes/mithril-aggregator.md +++ b/docs/website/root/manual/developer-docs/nodes/mithril-aggregator.md @@ -30,8 +30,8 @@ Mithril aggregator is responsible for collecting individual signatures from the ## Resources | Node | Source repository | Rust documentation | Docker packages | REST API -|:-:|:-----------------:|:------------------:|:---------------:| -**Mithril aggregator** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/pkgs/container/mithril-aggregator) | [:arrow_upper_right:](/aggregator-api) +|:----:|:-----------------:|:------------------:|:---------------:|:--------:| +**Mithril aggregator** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/pkgs/container/mithril-aggregator) | [:arrow_upper_right:](/doc/aggregator-api) ## Pre-requisites @@ -300,7 +300,7 @@ You can run 'era generate-tx-datum' to create the transaction datum file that wi **Case 1**: If there is only one supported era in the code, create the datum file: ```bash -./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** +./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** --target-path **TARGET_PATH** ``` You should see something like: @@ -312,13 +312,13 @@ You should see something like: **Case 2**: If there are two supported eras in the code and the activation epoch of the upcoming era is not yet known, run the command: ```bash -./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** +./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** --target-path **TARGET_PATH** ``` **Case 3**: If there are two supported eras in the code and the activation epoch of the era switch is known to be at the following epoch, run the command: ```bash -./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --next-era-epoch **EPOCH_AT_WHICH_NEXT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** +./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --next-era-epoch **EPOCH_AT_WHICH_NEXT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** --target-path **TARGET_PATH** ``` ## Release the build and run the binary 'tools' command @@ -439,8 +439,10 @@ Here is a list of the available parameters: | `snapshot_bucket_name` | - | - | `SNAPSHOT_BUCKET_NAME` | Name of the bucket where the snapshots are stored | - | `snapshot-bucket` | :heavy_check_mark: | Required if `snapshot_uploader_type` is `gcp` | `snapshot_use_cdn_domain` | - | - | `SNAPSHOT_USE_CDN_DOMAIN` | Use CDN domain for constructing snapshot url | `false` | - | - | To be used if `snapshot_uploader_type` is `gcp` | `run_interval` | - | - | `RUN_INTERVAL` | Interval between two runtime cycles in ms | - | `60000` | :heavy_check_mark: | +| `chain_observer_type` | `--chain-observer-type` | - | `CHAIN_OBSERVER_TYPE` | Chain observer type that can be `cardano-cli`, `pallas` or `fake`. | `pallas` | - | - | | `era_reader_adapter_type` | `--era-reader-adapter-type` | - | `ERA_READER_ADAPTER_TYPE` | Era reader adapter type that can be `cardano-chain`, `file` or `bootstrap`. | `bootstrap` | - | - | | `era_reader_adapter_params` | `--era-reader-adapter-params` | - | `ERA_READER_ADAPTER_PARAMS` | Era reader adapter params that is an optional JSON encoded parameters structure that is expected depending on the `era_reader_adapter_type` parameter | - | - | - | +| `signed_entity_types` | `--signed-entity-types` | - | `SIGNED_ENTITY_TYPES` | Signed entity types parameters (discriminants names in an ordered comma separated list) | - | `MithrilStakeDistribution,CardanoImmutableFilesFull,CardanoStakeDistribution` | - | | `snapshot_compression_algorithm` | `--snapshot-compression-algorithm` | - | `SNAPSHOT_COMPRESSION_ALGORITHM` | Compression algorithm of the snapshot archive | `zstandard` | `gzip` or `zstandard` | - | | `zstandard_parameters` | - | - | `ZSTANDARD_PARAMETERS__LEVEL` and `ZSTANDARD_PARAMETERS__NUMBER_OF_WORKERS` | Zstandard specific parameters | - | `{ level: 9, number_of_workers: 4 }` | - | @@ -483,5 +485,6 @@ Here is a list of the available parameters: | `current_era_epoch` | `--current-era-epoch` | - | `CURRENT_ERA_EPOCH` | Epoch at which current era starts. | - | - | - | :heavy_check_mark: | | `next_era_epoch` | `--next-era-epoch` | - | `NEXT_ERA_EPOCH` | Epoch at which the next era starts. If not specified and an upcoming era is available, it will announce the next era. If specified, it must be strictly greater than `current-epoch-era` | - | - | - | - | | `era_markers_secret_key` | `--era-markers-secret-key` | - | `ERA_MARKERS_SECRET_KEY` | Era markers secret key that is used to verify the authenticity of the era markers on the chain. | - | - | - | :heavy_check_mark: | +| `target_path` | `--target-path` | - | - | Path of the file to export the payload to. | - | - | - | - | The `tools recompute-certificates-hash` command has no dedicated parameters. diff --git a/docs/website/root/manual/developer-docs/nodes/mithril-client-library-wasm.md b/docs/website/root/manual/developer-docs/nodes/mithril-client-library-wasm.md new file mode 100644 index 00000000000..ecf3aee4ab9 --- /dev/null +++ b/docs/website/root/manual/developer-docs/nodes/mithril-client-library-wasm.md @@ -0,0 +1,120 @@ +--- +sidebar_position: 5 +--- + +import NetworksMatrix from '../../../networks-matrix.md'; +import CompiledBinaries from '../../../compiled-binaries.md' + +# Mithril client library WASM + +:::info + +Mithril client library WASM can be used by Javascript developers to use the Mithril network in their web applications. + +It is responsible for handling the different types of data certified by Mithril, and available through a Mithril aggregator: +- [**Snapshot**](../../../glossary.md#snapshot): list and get. +- [**Mithril stake distribution**](../../../glossary.md#stake-distribution): list and get. +- [**Certificate**](../../../glossary.md#certificate): list, get, and chain validation. + +::: + +:::tip + +* For more information about the **Mithril network**, please see the [architecture](../../../mithril/mithril-network/architecture.md) overview. + +::: + +:::note Mithril networks + + + +::: + +## Resources + +| Node | Source repository | Rust documentation | +|:-:|:-----------------:|:------------------:| +**Mithril client WASM** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client-wasm) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client_wasm/index.html) | + + +## Installation + +The Mithril client library is compatible with the following browsers: + +| Browser | Minimum version | Released | Tested in CI | +| --- |:---:|:---:|:---:| +| **Chrome** | `54` | 2016-10-12 | :heavy_check_mark: | +| **Edge** | `79` | 2020-01-15 | - | +| **Firefox** | `38` | 2015-05-12 | :heavy_check_mark: | +| **Opera** | `41` | 2016-10-25 | - | +| **Safari** | `15.4` | 2022-03-14 | - | +| **Chrome Android** | `54` | 2016-10-19 | - | +| **Firefox for Android** | `38` | 2015-05-12 | - | +| **Opera Android** | `41` | 2016-10-25 | - | +| **Safari on iOS** | `15.4` | 2022-03-14 | - | + +In your Javascript project, use `npm` to add [mithril-client-wasm](https://www.npmjs.com/package/@mithril-dev/mithril-client-wasm) library as a dependency: + +```bash +npm i @mithril-dev/mithril-client-wasm +``` + +## Using Mithril client library + +Below is a basic example of how to use most of the functions exposed by the Mithril client library: + +```js +import initMithrilClient, { MithrilClient } from "@mithril-dev/mithril-client-wasm" + +let aggregator_endpoint = + "https://aggregator.testing-preview.api.mithril.network/aggregator" +let genesis_verification_key = + "5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d" + +const broadcast_channel = new BroadcastChannel("mithril-client"); +broadcast_channel.onmessage = (e) => { + let event = e.data; + if (event.type == "CertificateChainValidationStarted") { + console.log("The certificate chain validation has started"); + } else if (event.type == "CertificateValidated") { + console.log("A certificate has been validated, certificate_hash: " + event.payload.certificate_hash); + } else if (event.type == "CertificateChainValidated") { + console.log("The certificate chain is valid"); + } else { + console.log(event); + } +}; + +await initMithrilClient(); + +let client = await new MithrilClient( + aggregator_endpoint, + genesis_verification_key +) +let mithril_stake_distributions_list = await client.list_mithril_stake_distributions(); +console.log("stake distributions:", mithril_stake_distributions_list); + +let last_mithril_stake_distribution = mithril_stake_distributions_list[0]; +console.log("last_mithril_stake_distribution:", last_mithril_stake_distribution); + +let last_stake_distribution = await client.get_mithril_stake_distribution(last_mithril_stake_distribution.hash); +console.log("last_stake_distribution:", last_stake_distribution); + +let certificate = await client.get_mithril_certificate(last_stake_distribution.certificate_hash); +console.log("certificate:", certificate); + +let last_certificate_from_chain = await client.verify_certificate_chain(certificate.hash); +console.log("verify certificate chain OK, last_certificate_from_chain:", last_certificate_from_chain); + +let mithril_stake_distributions_message = await client.compute_mithril_stake_distribution_message(last_stake_distribution); +console.log("mithril_stake_distributions_message:", mithril_stake_distributions_message); + +let valid_stake_distribution_message = await client.verify_message_match_certificate(mithril_stake_distributions_message, last_certificate_from_chain); +console.log("valid_stake_distribution_message:", valid_stake_distribution_message); +``` + +:::tip + +You can read the complete [Rust developer documentation](https://mithril.network/rust-doc/mithril_client_wasm/index.html). + +::: \ No newline at end of file diff --git a/docs/website/root/manual/developer-docs/nodes/mithril-client-library.md b/docs/website/root/manual/developer-docs/nodes/mithril-client-library.md index 2901e3ed0b2..7fa5bade0cc 100644 --- a/docs/website/root/manual/developer-docs/nodes/mithril-client-library.md +++ b/docs/website/root/manual/developer-docs/nodes/mithril-client-library.md @@ -12,9 +12,9 @@ import CompiledBinaries from '../../../compiled-binaries.md' Mithril client library can be used by Rust developers to use the Mithril network in their applications. It is responsible for handling the different types of data certified by Mithril, and available through a Mithril aggregator: -- [**Snapshot**](../../../glossary.md#snapshot): list, get and download tarball. -- [**Mithril stake distribution**](../../../glossary#stake-distribution): list and get. -- [**Certificate**](../../../glossary#certificate): list, get, and chain validation. +- [**Snapshot**](../../../glossary.md#snapshot): list, get, download tarball and record statistics. +- [**Mithril stake distribution**](../../../glossary.md#stake-distribution): list and get. +- [**Certificate**](../../../glossary.md#certificate): list, get, and chain validation. ::: @@ -38,7 +38,7 @@ It is responsible for handling the different types of data certified by Mithril, | Node | Source repository | Rust documentation | |:-:|:-----------------:|:------------------:| -**Mithril client** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client) | [:arrow_upper_right:](https://mithril.network/mithril-client/doc/mithril_client/index.html) | +**Mithril client** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client/index.html) | ## Pre-requisites @@ -88,6 +88,10 @@ async fn main() -> mithril_client::MithrilResult<()> { .snapshot() .download_unpack(&snapshot, target_directory) .await?; + + if let Err(e) = client.snapshot().add_statistics(&snapshot).await { + println!("Could not increment snapshot download statistics: {:?}", e); + } let message = MessageBuilder::new() .compute_snapshot_message(&certificate, target_directory) @@ -142,6 +146,10 @@ async fn main() -> mithril_client::MithrilResult<()> { .snapshot() .download_unpack(&snapshot, target_directory) .await?; + + if let Err(e) = client.snapshot().add_statistics(&snapshot).await { + println!("Could not increment snapshot download statistics: {:?}", e); + } let message = MessageBuilder::new() .compute_snapshot_message(&certificate, target_directory) diff --git a/docs/website/root/manual/developer-docs/nodes/mithril-client.md b/docs/website/root/manual/developer-docs/nodes/mithril-client.md index 9a99906e911..9646844ef43 100644 --- a/docs/website/root/manual/developer-docs/nodes/mithril-client.md +++ b/docs/website/root/manual/developer-docs/nodes/mithril-client.md @@ -137,6 +137,10 @@ Options: Directory where configuration file is located [default: ./config] --aggregator-endpoint Override configuration Aggregator endpoint URL + --log-format-json + Enable JSON output for logs displayed according to verbosity level + --log-output + Redirect the logs to a file -h, --help Print help -V, --version @@ -296,13 +300,21 @@ Here is a list of the available parameters: | `network` | - | - | `NETWORK` | Cardano network | - | `testnet` or `mainnet` or `devnet` | :heavy_check_mark: | | `aggregator_endpoint` | `--aggregator-endpoint` | - | `AGGREGATOR_ENDPOINT` | Aggregator node endpoint | - | `https://aggregator.pre-release-preview.api.mithril.network/aggregator` | :heavy_check_mark: | | `genesis_verification_key` | - | - | `GENESIS_VERIFICATION_KEY` | Genesis verification key | - | - | :heavy_check_mark: | -| `json_output` | `--json` | `-j` | - | Enable JSON output | no | - | - | +| `log_format_json` | `--log-format-json` | - | - | Enable JSON output for logs | - | - | - | +| `log_output` | `--log-output` | `-o` | - | Redirect the logs to a file | - | `./mithril-client.log` | - | `snapshot show` command: | Parameter | Command line (long) | Command line (short) | Environment variable | Description | Default value | Example | Mandatory | |-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| | `digest` | `--digest` | - | `DIGEST` | Snapshot digest or `latest` for the latest digest | - | - | :heavy_check_mark: | +| `json` | `--json` | - | - | Enable JSON output for command results | - | - | - | + +`snapshot list` command: + +| Parameter | Command line (long) | Command line (short) | Environment variable | Description | Default value | Example | Mandatory | +|-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| +| `json` | `--json` | - | - | Enable JSON output for command results | - | - | - | `snapshot download` command: @@ -310,6 +322,13 @@ Here is a list of the available parameters: |-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| | `digest` | `--digest` | - | `DIGEST` | Snapshot digest or `latest` for the latest digest | - | - | :heavy_check_mark: | | `download_dir` | `--download-dir` | - | - | Directory where the snapshot will be downloaded | . | - | - | +| `json` | `--json` | - | - | Enable JSON output for progress logs | - | - | - | + +`mithril-stake-distribution list` command: + +| Parameter | Command line (long) | Command line (short) | Environment variable | Description | Default value | Example | Mandatory | +|-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| +| `json` | `--json` | - | - | Enable JSON output for command results | - | - | - | `mithril-stake-distribution download` command: diff --git a/docs/website/root/manual/developer-docs/references.md b/docs/website/root/manual/developer-docs/references.md index 11406389ecf..e6234a0b455 100644 --- a/docs/website/root/manual/developer-docs/references.md +++ b/docs/website/root/manual/developer-docs/references.md @@ -27,8 +27,9 @@ To learn more about the **Mithril protocol**, please refer to the [about Mithril | Dependency | Description | Source repository | Rust documentation | REST API |------------|-------------|:-----------------:|:------------------:|:------------:| | **Mithril common** | The **common** library used by **Mithril network** nodes. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-common) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_common/index.html) | - +| **Mithril persistence** | The **persistence** library used by **Mithril network** nodes. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-persistence) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_persistence/index.html) | - | **Mithril STM** | The **core** library that implements the cryptographic engine for the **Mithril** protocol. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-stm) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_stm/index.html) | - -| **Mithril aggregator** | The node within the **Mithril network** responsible for collecting individual signatures from the **Mithril signers** and aggregating them into a multi-signature. This capability enables the **Mithril aggregator** to provide certified snapshots of the **Cardano** blockchain. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](/aggregator-api) +| **Mithril aggregator** | The node within the **Mithril network** responsible for collecting individual signatures from the **Mithril signers** and aggregating them into a multi-signature. This capability enables the **Mithril aggregator** to provide certified snapshots of the **Cardano** blockchain. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](/doc/aggregator-api) | **Mithril client CLI** | The node within the **Mithril network** responsible for restoring the **Cardano** blockchain on an empty node from a certified snapshot. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client-cli) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client_cli/index.html) | - | **Mithril client** | The library that can be used by developers to interact with Mithril certified data in their applications. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client/index.html) | - | **Mithril signer** | The node responsible for producing individual signatures that are collected and aggregated by the **Mithril aggregator**. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-signer) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_signer/index.html) | - diff --git a/docs/website/root/manual/getting-started/SPO-on-boarding-guide.md b/docs/website/root/manual/getting-started/SPO-on-boarding-guide.md index 72113be7233..59a2a260ab7 100644 --- a/docs/website/root/manual/getting-started/SPO-on-boarding-guide.md +++ b/docs/website/root/manual/getting-started/SPO-on-boarding-guide.md @@ -30,12 +30,11 @@ SPO beta mainnet deployment : Mandatory : SPOs run Mithril in their mainnet infr :::info -This step is **optional**, but recommended as it helps us deliver quality software. We are actively looking for SPO candidates to test Mithril on the Cardano testnets. Contact us [here](https://contact.mithril.network/) if you are interested! +This step is **optional**, but recommended as it helps us deliver quality software. We are actively looking for SPO candidates to test Mithril on the Cardano testnets. ::: To participate in the Pioneer Program, you will need to: -- Register for the **Mithril SPO Pioneer Program** using this [form](https://contact.mithril.network/). - Run an active SPO on the Cardano `preview` network for at least one epoch or one day. - Set up a **Mithril signer** node on the `pre-release-preview` Mithril network by following the [**Run a Mithril signer node (SPO)**](run-signer-node.md) guide. - You can choose between the **Naive** (easier to set up) or the **Production** deployment models. diff --git a/docs/website/root/manual/getting-started/bootstrap-cardano-node.md b/docs/website/root/manual/getting-started/bootstrap-cardano-node.md index 56573cc6806..9e7f6ffcef8 100644 --- a/docs/website/root/manual/getting-started/bootstrap-cardano-node.md +++ b/docs/website/root/manual/getting-started/bootstrap-cardano-node.md @@ -281,7 +281,7 @@ You will see more information about the snapshot: +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ | Location 1 | https://storage.googleapis.com/mithril-release-preprod-…aa11b0e2ccf737d4f5def8b0a9f2245eded2b4ec4be876f7bd64deddcbbf.tar.gz | +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ -| Cardano node version | 8.1.2 | +| Cardano node version | 8.7.3 | +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ | Created | 2023-05-31T14:02:40.150189810Z | +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ diff --git a/docs/website/root/manual/getting-started/run-signer-node.md b/docs/website/root/manual/getting-started/run-signer-node.md index a915f40e4ea..c72a3bea5fb 100644 --- a/docs/website/root/manual/getting-started/run-signer-node.md +++ b/docs/website/root/manual/getting-started/run-signer-node.md @@ -77,7 +77,7 @@ Note that this guide works on a Linux machine only. * Read rights on the `Database` folder (specified by the `--database-path` setting of the **Cardano node**) * Read and write rights on the `Inter Process Communication` file (typically defined by the `CARDANO_NODE_SOCKET_PATH` environment variable used to launch the **Cardano node**) -* Install a recent version of [`cardano-cli`](https://github.com/input-output-hk/cardano-node/releases/tag/8.1.2) (version 8.1.2+). +* Install a recent version of [`cardano-cli`](https://github.com/input-output-hk/cardano-node/releases/tag/8.7.3) (version 8.7.3+). * Install a correctly configured Rust toolchain (latest stable version). You can follow the instructions provided [here](https://www.rust-lang.org/learn/get-started). @@ -352,7 +352,7 @@ StartLimitIntervalSec=0 [Service] Type=simple Restart=always -RestartSec=1 +RestartSec=60 User=cardano EnvironmentFile=/opt/mithril/mithril-signer.env ExecStart=/opt/mithril/mithril-signer -vvv diff --git a/docs/website/root/mithril/mithril-network/aggregator.md b/docs/website/root/mithril/mithril-network/aggregator.md index 45f1dcef0bc..1fe43c98959 100644 --- a/docs/website/root/mithril/mithril-network/aggregator.md +++ b/docs/website/root/mithril/mithril-network/aggregator.md @@ -91,7 +91,7 @@ In its initial version, the Mithril aggregator comprises two main components: :::tip -The Mithril aggregator's **REST API** documentation can be found [here](/aggregator-api). +The Mithril aggregator's **REST API** documentation can be found [here](/doc/aggregator-api). ::: diff --git a/docs/website/root/networks-matrix.md b/docs/website/root/networks-matrix.md index 1513d83c873..7ac2d3a70b1 100644 --- a/docs/website/root/networks-matrix.md +++ b/docs/website/root/networks-matrix.md @@ -20,7 +20,7 @@ Here is an updated list of all **Mithril networks**, including their configurati |------------|------------ | **Mithril network** | `release-mainnet` | **Cardano network** | `mainnet` -| **Cardano magic id** | `-` +| **Cardano magic Id** | `-` | **Supported** | Yes :heavy_check_mark: | **Status** | Beta 🟢 | **Aggregator endpoint** | `https://aggregator.release-mainnet.api.mithril.network/aggregator` [:arrow_upper_right:](https://aggregator.release-mainnet.api.mithril.network/aggregator) @@ -71,7 +71,7 @@ Here is an updated list of all **Mithril networks**, including their configurati
## `testing-preview` -> :warning: For devs only +> :warning: For developers only | Information | - |------------|------------ @@ -85,6 +85,25 @@ Here is an updated list of all **Mithril networks**, including their configurati | **Era reader adapter type** | `cardano-chain` | **Era reader address** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.addr` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.addr) | **Era reader verification key** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.vkey` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.vkey) +| **Build from** | **Main branch** [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main) + + + +## `testing-sanchonet` +> :warning: For developers only + +| Information | - +|------------|------------ +| **Mithril network** | `testing-sanchonet` [:mag_right:](https://mithril.network/explorer?aggregator=https%3A%2F%2Faggregator.testing-sanchonet.api.mithril.network%2Faggregator) +| **Cardano network** | `sanchonet` +| **Cardano magic Id** | `4` +| **Supported** | Yes :heavy_check_mark: +| **Status** | Unstable 🔴 +| **Aggregator endpoint** | `https://aggregator.testing-sanchonet.api.mithril.network/aggregator` [:arrow_upper_right:](https://aggregator.testing-sanchonet.api.mithril.network/aggregator) +| **Genesis verification key** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/genesis.vkey` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/genesis.vkey) +| **Era reader adapter type** | `cardano-chain` +| **Era reader address** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.addr` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.addr) +| **Era reader verification key** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.vkey` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.vkey) | **Build from** | **Main branch** [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main) diff --git a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-aggregator.md b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-aggregator.md index 4d38b0f9366..87c4b25c399 100644 --- a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-aggregator.md +++ b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-aggregator.md @@ -30,8 +30,8 @@ Mithril aggregator is responsible for collecting individual signatures from the ## Resources | Node | Source repository | Rust documentation | Docker packages | REST API -|:-:|:-----------------:|:------------------:|:---------------:| -**Mithril aggregator** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/pkgs/container/mithril-aggregator) | [:arrow_upper_right:](/aggregator-api) +|:----:|:-----------------:|:------------------:|:---------------:|:--------:| +**Mithril aggregator** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/pkgs/container/mithril-aggregator) | [:arrow_upper_right:](/doc/aggregator-api) ## Pre-requisites @@ -300,7 +300,7 @@ You can run 'era generate-tx-datum' to create the transaction datum file that wi **Case 1**: If there is only one supported era in the code, create the datum file: ```bash -./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** +./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** --target-path **TARGET_PATH** ``` You should see something like: @@ -312,13 +312,13 @@ You should see something like: **Case 2**: If there are two supported eras in the code and the activation epoch of the upcoming era is not yet known, run the command: ```bash -./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** +./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** --target-path **TARGET_PATH** ``` **Case 3**: If there are two supported eras in the code and the activation epoch of the era switch is known to be at the following epoch, run the command: ```bash -./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --next-era-epoch **EPOCH_AT_WHICH_NEXT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** +./mithril-aggregator era generate-tx-datum --current-era-epoch **EPOCH_AT_WHICH_CURRENT_ERA_STARTS** --next-era-epoch **EPOCH_AT_WHICH_NEXT_ERA_STARTS** --era-markers-secret-key **YOUR_ERA_ACTIVATION_SECRET_KEY** --target-path **TARGET_PATH** ``` ## Release the build and run the binary 'tools' command @@ -439,8 +439,10 @@ Here is a list of the available parameters: | `snapshot_bucket_name` | - | - | `SNAPSHOT_BUCKET_NAME` | Name of the bucket where the snapshots are stored | - | `snapshot-bucket` | :heavy_check_mark: | Required if `snapshot_uploader_type` is `gcp` | `snapshot_use_cdn_domain` | - | - | `SNAPSHOT_USE_CDN_DOMAIN` | Use CDN domain for constructing snapshot url | `false` | - | - | To be used if `snapshot_uploader_type` is `gcp` | `run_interval` | - | - | `RUN_INTERVAL` | Interval between two runtime cycles in ms | - | `60000` | :heavy_check_mark: | +| `chain_observer_type` | `--chain-observer-type` | - | `CHAIN_OBSERVER_TYPE` | Chain observer type that can be `cardano-cli`, `pallas` or `fake`. | `pallas` | - | - | | `era_reader_adapter_type` | `--era-reader-adapter-type` | - | `ERA_READER_ADAPTER_TYPE` | Era reader adapter type that can be `cardano-chain`, `file` or `bootstrap`. | `bootstrap` | - | - | | `era_reader_adapter_params` | `--era-reader-adapter-params` | - | `ERA_READER_ADAPTER_PARAMS` | Era reader adapter params that is an optional JSON encoded parameters structure that is expected depending on the `era_reader_adapter_type` parameter | - | - | - | +| `signed_entity_types` | `--signed-entity-types` | - | `SIGNED_ENTITY_TYPES` | Signed entity types parameters (discriminants names in an ordered comma separated list) | - | `MithrilStakeDistribution,CardanoImmutableFilesFull,CardanoStakeDistribution` | - | | `snapshot_compression_algorithm` | `--snapshot-compression-algorithm` | - | `SNAPSHOT_COMPRESSION_ALGORITHM` | Compression algorithm of the snapshot archive | `zstandard` | `gzip` or `zstandard` | - | | `zstandard_parameters` | - | - | `ZSTANDARD_PARAMETERS__LEVEL` and `ZSTANDARD_PARAMETERS__NUMBER_OF_WORKERS` | Zstandard specific parameters | - | `{ level: 9, number_of_workers: 4 }` | - | @@ -483,5 +485,6 @@ Here is a list of the available parameters: | `current_era_epoch` | `--current-era-epoch` | - | `CURRENT_ERA_EPOCH` | Epoch at which current era starts. | - | - | - | :heavy_check_mark: | | `next_era_epoch` | `--next-era-epoch` | - | `NEXT_ERA_EPOCH` | Epoch at which the next era starts. If not specified and an upcoming era is available, it will announce the next era. If specified, it must be strictly greater than `current-epoch-era` | - | - | - | - | | `era_markers_secret_key` | `--era-markers-secret-key` | - | `ERA_MARKERS_SECRET_KEY` | Era markers secret key that is used to verify the authenticity of the era markers on the chain. | - | - | - | :heavy_check_mark: | +| `target_path` | `--target-path` | - | - | Path of the file to export the payload to. | - | - | - | - | The `tools recompute-certificates-hash` command has no dedicated parameters. diff --git a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library-wasm.md b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library-wasm.md new file mode 100644 index 00000000000..833ed457d1e --- /dev/null +++ b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library-wasm.md @@ -0,0 +1,118 @@ +--- +sidebar_position: 5 +--- + +import NetworksMatrix from '../../../networks-matrix.md'; +import CompiledBinaries from '../../../compiled-binaries.md' + +# Mithril client library WASM + +:::info + +Mithril client library WASM can be used by Javascript developers to use the Mithril network in their web applications. + +It is responsible for handling the different types of data certified by Mithril, and available through a Mithril aggregator: +- [**Snapshot**](../../../glossary.md#snapshot): list and get. +- [**Mithril stake distribution**](../../../glossary.md#stake-distribution): list and get. +- [**Certificate**](../../../glossary.md#certificate): list, get, and chain validation. + +::: + +:::tip + +* For more information about the **Mithril network**, please see the [architecture](../../../mithril/mithril-network/architecture.md) overview. + +::: + +:::note Mithril networks + + + +::: + +## Resources + +| Node | Source repository | Rust documentation | +|:-:|:-----------------:|:------------------:| +**Mithril client WASM** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client-wasm) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client_wasm/index.html) | + + +## Installation + +The Mithril client library is compatible with the following browsers: + +| Browser | Minimum version | Released | Tested in CI | +| --- |:---:|:---:|:---:| +| **Chrome** | `54` | 2016-10-12 | :heavy_check_mark: | +| **Edge** | `79` | 2020-01-15 | - | +| **Firefox** | `38` | 2015-05-12 | :heavy_check_mark: | +| **Opera** | `41` | 2016-10-25 | - | +| **Safari** | `15.4` | 2022-03-14 | - | +| **Chrome Android** | `54` | 2016-10-19 | - | +| **Firefox for Android** | `38` | 2015-05-12 | - | +| **Opera Android** | `41` | 2016-10-25 | - | +| **Safari on iOS** | `15.4` | 2022-03-14 | - | + +In your Javascript project, use `npm` to add [mithril-client]https://www.npmjs.com/package/@mithril-dev/mithril-client-wasm) library as a dependency: + +```bash +npm i @mithril-dev/mithril-client-wasm +``` + +## Using Mithril client library + +Below is a basic example of how to use most of the functions exposed by the Mithril client library: + +```js +import { MithrilClient } from "@mithril-dev/mithril-client-wasm" + +let aggregator_endpoint = + "https://aggregator.testing-preview.api.mithril.network/aggregator" +let genesis_verification_key = + "5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d" + +const broadcast_channel = new BroadcastChannel("mithril-client"); +broadcast_channel.onmessage = (e) => { + let event = e.data; + if (event.type == "CertificateChainValidationStarted") { + console.log("The certificate chain validation has started"); + } else if (event.type == "CertificateValidated") { + console.log("A certificate has been validated, certificate_hash: " + event.payload.certificate_hash); + } else if (event.type == "CertificateChainValidated") { + console.log("The certificate chain is valid"); + } else { + console.log(event); + } +}; + +let client = await new MithrilClient( + aggregator_endpoint, + genesis_verification_key +) +let mithril_stake_distributions_list = await client.list_mithril_stake_distributions(); +console.log("stake distributions:", mithril_stake_distributions_list); + +let last_mithril_stake_distribution = mithril_stake_distributions_list[0]; +console.log("last_mithril_stake_distribution:", last_mithril_stake_distribution); + +let last_stake_distribution = await client.get_mithril_stake_distribution(last_mithril_stake_distribution.hash); +console.log("last_stake_distribution:", last_stake_distribution); + +let certificate = await client.get_mithril_certificate(last_stake_distribution.certificate_hash); +console.log("certificate:", certificate); + +let last_certificate_from_chain = await client.verify_certificate_chain(certificate.hash); +console.log("verify certificate chain OK, last_certificate_from_chain:", last_certificate_from_chain); + +let mithril_stake_distributions_message = await client.compute_mithril_stake_distribution_message(last_stake_distribution); +console.log("mithril_stake_distributions_message:", mithril_stake_distributions_message); + +let valid_stake_distribution_message = await client.verify_message_match_certificate(mithril_stake_distributions_message, last_certificate_from_chain); +console.log("valid_stake_distribution_message:", valid_stake_distribution_message); +``` + +:::tip + +You can read the complete [Rust developer documentation](https://mithril.network/rust-doc/mithril_client_wasm/index.html). + +::: \ No newline at end of file diff --git a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library.md b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library.md index 1848e32f9c1..7fa5bade0cc 100644 --- a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library.md +++ b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client-library.md @@ -12,9 +12,9 @@ import CompiledBinaries from '../../../compiled-binaries.md' Mithril client library can be used by Rust developers to use the Mithril network in their applications. It is responsible for handling the different types of data certified by Mithril, and available through a Mithril aggregator: -- [**Snapshot**](../../../glossary.md#snapshot): list, get and download tarball. -- [**Mithril stake distribution**](../../../glossary#stake-distribution): list and get. -- [**Certificate**](../../../glossary#certificate): list, get, and chain validation. +- [**Snapshot**](../../../glossary.md#snapshot): list, get, download tarball and record statistics. +- [**Mithril stake distribution**](../../../glossary.md#stake-distribution): list and get. +- [**Certificate**](../../../glossary.md#certificate): list, get, and chain validation. ::: @@ -38,7 +38,7 @@ It is responsible for handling the different types of data certified by Mithril, | Node | Source repository | Rust documentation | |:-:|:-----------------:|:------------------:| -**Mithril client** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client) | [:arrow_upper_right:](https://mithril.network/mithril-client/doc/mithril_client/index.html) | +**Mithril client** | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client/index.html) | ## Pre-requisites @@ -88,6 +88,10 @@ async fn main() -> mithril_client::MithrilResult<()> { .snapshot() .download_unpack(&snapshot, target_directory) .await?; + + if let Err(e) = client.snapshot().add_statistics(&snapshot).await { + println!("Could not increment snapshot download statistics: {:?}", e); + } let message = MessageBuilder::new() .compute_snapshot_message(&certificate, target_directory) @@ -102,10 +106,16 @@ async fn main() -> mithril_client::MithrilResult<()> { Snapshot download and certificate chain validation can take quite some time even with a fast computer and network. We have implemented a feedback mechanism for them, more details on it are available in the [feedback sub-module](https://mithril.network/rust-doc/mithril_client/feedback/index.html). -An example of implementation with the crate [indicatif](https://crates.io/crates/indicatif) is available in the [Mithril repository](https://github.com/input-output-hk/mithril/tree/main/mithril-client/examples/snapshot_list_get_show_download_verify.rs). To run it, execute the following command: +An example of implementation with the crate [indicatif](https://crates.io/crates/indicatif) is available in the [Mithril repository](https://github.com/input-output-hk/mithril/tree/main/examples/client-snapshot/src/main.rs). To run it, execute the following command: + +```bash +cargo run -p client-snapshot +``` + +or directly from the example crate directory: ```bash -cargo run --example snapshot_list_get_show_download_verify --features fs +cargo run ``` ::: @@ -136,6 +146,10 @@ async fn main() -> mithril_client::MithrilResult<()> { .snapshot() .download_unpack(&snapshot, target_directory) .await?; + + if let Err(e) = client.snapshot().add_statistics(&snapshot).await { + println!("Could not increment snapshot download statistics: {:?}", e); + } let message = MessageBuilder::new() .compute_snapshot_message(&certificate, target_directory) diff --git a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client.md b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client.md index 9a99906e911..9646844ef43 100644 --- a/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client.md +++ b/docs/website/versioned_docs/version-maintained/manual/developer-docs/nodes/mithril-client.md @@ -137,6 +137,10 @@ Options: Directory where configuration file is located [default: ./config] --aggregator-endpoint Override configuration Aggregator endpoint URL + --log-format-json + Enable JSON output for logs displayed according to verbosity level + --log-output + Redirect the logs to a file -h, --help Print help -V, --version @@ -296,13 +300,21 @@ Here is a list of the available parameters: | `network` | - | - | `NETWORK` | Cardano network | - | `testnet` or `mainnet` or `devnet` | :heavy_check_mark: | | `aggregator_endpoint` | `--aggregator-endpoint` | - | `AGGREGATOR_ENDPOINT` | Aggregator node endpoint | - | `https://aggregator.pre-release-preview.api.mithril.network/aggregator` | :heavy_check_mark: | | `genesis_verification_key` | - | - | `GENESIS_VERIFICATION_KEY` | Genesis verification key | - | - | :heavy_check_mark: | -| `json_output` | `--json` | `-j` | - | Enable JSON output | no | - | - | +| `log_format_json` | `--log-format-json` | - | - | Enable JSON output for logs | - | - | - | +| `log_output` | `--log-output` | `-o` | - | Redirect the logs to a file | - | `./mithril-client.log` | - | `snapshot show` command: | Parameter | Command line (long) | Command line (short) | Environment variable | Description | Default value | Example | Mandatory | |-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| | `digest` | `--digest` | - | `DIGEST` | Snapshot digest or `latest` for the latest digest | - | - | :heavy_check_mark: | +| `json` | `--json` | - | - | Enable JSON output for command results | - | - | - | + +`snapshot list` command: + +| Parameter | Command line (long) | Command line (short) | Environment variable | Description | Default value | Example | Mandatory | +|-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| +| `json` | `--json` | - | - | Enable JSON output for command results | - | - | - | `snapshot download` command: @@ -310,6 +322,13 @@ Here is a list of the available parameters: |-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| | `digest` | `--digest` | - | `DIGEST` | Snapshot digest or `latest` for the latest digest | - | - | :heavy_check_mark: | | `download_dir` | `--download-dir` | - | - | Directory where the snapshot will be downloaded | . | - | - | +| `json` | `--json` | - | - | Enable JSON output for progress logs | - | - | - | + +`mithril-stake-distribution list` command: + +| Parameter | Command line (long) | Command line (short) | Environment variable | Description | Default value | Example | Mandatory | +|-----------|---------------------|:---------------------:|----------------------|-------------|---------------|---------|:---------:| +| `json` | `--json` | - | - | Enable JSON output for command results | - | - | - | `mithril-stake-distribution download` command: diff --git a/docs/website/versioned_docs/version-maintained/manual/developer-docs/references.md b/docs/website/versioned_docs/version-maintained/manual/developer-docs/references.md index 11406389ecf..d95063d9ec8 100644 --- a/docs/website/versioned_docs/version-maintained/manual/developer-docs/references.md +++ b/docs/website/versioned_docs/version-maintained/manual/developer-docs/references.md @@ -28,7 +28,7 @@ To learn more about the **Mithril protocol**, please refer to the [about Mithril |------------|-------------|:-----------------:|:------------------:|:------------:| | **Mithril common** | The **common** library used by **Mithril network** nodes. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-common) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_common/index.html) | - | **Mithril STM** | The **core** library that implements the cryptographic engine for the **Mithril** protocol. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-stm) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_stm/index.html) | - -| **Mithril aggregator** | The node within the **Mithril network** responsible for collecting individual signatures from the **Mithril signers** and aggregating them into a multi-signature. This capability enables the **Mithril aggregator** to provide certified snapshots of the **Cardano** blockchain. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](/aggregator-api) +| **Mithril aggregator** | The node within the **Mithril network** responsible for collecting individual signatures from the **Mithril signers** and aggregating them into a multi-signature. This capability enables the **Mithril aggregator** to provide certified snapshots of the **Cardano** blockchain. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-aggregator) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_aggregator/index.html) | [:arrow_upper_right:](/doc/aggregator-api) | **Mithril client CLI** | The node within the **Mithril network** responsible for restoring the **Cardano** blockchain on an empty node from a certified snapshot. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client-cli) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client_cli/index.html) | - | **Mithril client** | The library that can be used by developers to interact with Mithril certified data in their applications. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-client) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_client/index.html) | - | **Mithril signer** | The node responsible for producing individual signatures that are collected and aggregated by the **Mithril aggregator**. | [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main/mithril-signer) | [:arrow_upper_right:](https://mithril.network/rust-doc/mithril_signer/index.html) | - diff --git a/docs/website/versioned_docs/version-maintained/manual/getting-started/SPO-on-boarding-guide.md b/docs/website/versioned_docs/version-maintained/manual/getting-started/SPO-on-boarding-guide.md index 72113be7233..59a2a260ab7 100644 --- a/docs/website/versioned_docs/version-maintained/manual/getting-started/SPO-on-boarding-guide.md +++ b/docs/website/versioned_docs/version-maintained/manual/getting-started/SPO-on-boarding-guide.md @@ -30,12 +30,11 @@ SPO beta mainnet deployment : Mandatory : SPOs run Mithril in their mainnet infr :::info -This step is **optional**, but recommended as it helps us deliver quality software. We are actively looking for SPO candidates to test Mithril on the Cardano testnets. Contact us [here](https://contact.mithril.network/) if you are interested! +This step is **optional**, but recommended as it helps us deliver quality software. We are actively looking for SPO candidates to test Mithril on the Cardano testnets. ::: To participate in the Pioneer Program, you will need to: -- Register for the **Mithril SPO Pioneer Program** using this [form](https://contact.mithril.network/). - Run an active SPO on the Cardano `preview` network for at least one epoch or one day. - Set up a **Mithril signer** node on the `pre-release-preview` Mithril network by following the [**Run a Mithril signer node (SPO)**](run-signer-node.md) guide. - You can choose between the **Naive** (easier to set up) or the **Production** deployment models. diff --git a/docs/website/versioned_docs/version-maintained/manual/getting-started/bootstrap-cardano-node.md b/docs/website/versioned_docs/version-maintained/manual/getting-started/bootstrap-cardano-node.md index 56573cc6806..9e7f6ffcef8 100644 --- a/docs/website/versioned_docs/version-maintained/manual/getting-started/bootstrap-cardano-node.md +++ b/docs/website/versioned_docs/version-maintained/manual/getting-started/bootstrap-cardano-node.md @@ -281,7 +281,7 @@ You will see more information about the snapshot: +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ | Location 1 | https://storage.googleapis.com/mithril-release-preprod-…aa11b0e2ccf737d4f5def8b0a9f2245eded2b4ec4be876f7bd64deddcbbf.tar.gz | +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ -| Cardano node version | 8.1.2 | +| Cardano node version | 8.7.3 | +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ | Created | 2023-05-31T14:02:40.150189810Z | +-----------------------+-------------------------------------------------------------------------------------------------------------------------------+ diff --git a/docs/website/versioned_docs/version-maintained/manual/getting-started/run-signer-node.md b/docs/website/versioned_docs/version-maintained/manual/getting-started/run-signer-node.md index a915f40e4ea..c72a3bea5fb 100644 --- a/docs/website/versioned_docs/version-maintained/manual/getting-started/run-signer-node.md +++ b/docs/website/versioned_docs/version-maintained/manual/getting-started/run-signer-node.md @@ -77,7 +77,7 @@ Note that this guide works on a Linux machine only. * Read rights on the `Database` folder (specified by the `--database-path` setting of the **Cardano node**) * Read and write rights on the `Inter Process Communication` file (typically defined by the `CARDANO_NODE_SOCKET_PATH` environment variable used to launch the **Cardano node**) -* Install a recent version of [`cardano-cli`](https://github.com/input-output-hk/cardano-node/releases/tag/8.1.2) (version 8.1.2+). +* Install a recent version of [`cardano-cli`](https://github.com/input-output-hk/cardano-node/releases/tag/8.7.3) (version 8.7.3+). * Install a correctly configured Rust toolchain (latest stable version). You can follow the instructions provided [here](https://www.rust-lang.org/learn/get-started). @@ -352,7 +352,7 @@ StartLimitIntervalSec=0 [Service] Type=simple Restart=always -RestartSec=1 +RestartSec=60 User=cardano EnvironmentFile=/opt/mithril/mithril-signer.env ExecStart=/opt/mithril/mithril-signer -vvv diff --git a/docs/website/versioned_docs/version-maintained/mithril/mithril-network/aggregator.md b/docs/website/versioned_docs/version-maintained/mithril/mithril-network/aggregator.md index 45f1dcef0bc..1fe43c98959 100644 --- a/docs/website/versioned_docs/version-maintained/mithril/mithril-network/aggregator.md +++ b/docs/website/versioned_docs/version-maintained/mithril/mithril-network/aggregator.md @@ -91,7 +91,7 @@ In its initial version, the Mithril aggregator comprises two main components: :::tip -The Mithril aggregator's **REST API** documentation can be found [here](/aggregator-api). +The Mithril aggregator's **REST API** documentation can be found [here](/doc/aggregator-api). ::: diff --git a/docs/website/versioned_docs/version-maintained/networks-matrix.md b/docs/website/versioned_docs/version-maintained/networks-matrix.md index 1513d83c873..41dd72a566e 100644 --- a/docs/website/versioned_docs/version-maintained/networks-matrix.md +++ b/docs/website/versioned_docs/version-maintained/networks-matrix.md @@ -20,7 +20,7 @@ Here is an updated list of all **Mithril networks**, including their configurati |------------|------------ | **Mithril network** | `release-mainnet` | **Cardano network** | `mainnet` -| **Cardano magic id** | `-` +| **Cardano magic Id** | `-` | **Supported** | Yes :heavy_check_mark: | **Status** | Beta 🟢 | **Aggregator endpoint** | `https://aggregator.release-mainnet.api.mithril.network/aggregator` [:arrow_upper_right:](https://aggregator.release-mainnet.api.mithril.network/aggregator) @@ -71,7 +71,7 @@ Here is an updated list of all **Mithril networks**, including their configurati
## `testing-preview` -> :warning: For devs only +> :warning: For developers only | Information | - |------------|------------ @@ -85,6 +85,25 @@ Here is an updated list of all **Mithril networks**, including their configurati | **Era reader adapter type** | `cardano-chain` | **Era reader address** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.addr` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.addr) | **Era reader verification key** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.vkey` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-preview/era.vkey) +| **Build from** | **Main branch** [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main) + + + +## `testing-sanchonet` +> :warning: For developers only + +| Information | - +|------------|------------ +| **Mithril network** | `testing-sanchonet` [:mag_right:](https://mithril.network/explorer?aggregator=https%3A%2F%2Faggregator.testing-sanchonet.api.mithril.network%2Faggregator) +| **Cardano network** | `sanchonet` +| **Cardano magic Id** | `4` +| **Supported** | Yes :heavy_check_mark: +| **Status** | Unstable 🔴 +| **Aggregator endpoint** | `https://aggregator.testing-sanchonet.api.mithril.network/aggregator` [:arrow_upper_right:](https://aggregator.testing-sanchonet.api.mithril.network/aggregator) +| **Genesis verification key** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/genesis.vkey` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/genesis.vkey) +| **Era reader adapter type** | `cardano-chain` +| **Era reader address** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.addr` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.addr) +| **Era reader verification key** | `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.vkey` [:arrow_upper_right:](https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/era.vkey) | **Build from** | **Main branch** [:arrow_upper_right:](https://github.com/input-output-hk/mithril/tree/main) @@ -93,11 +112,11 @@ Here is an updated list of all **Mithril networks**, including their configurati :::caution In this documentation, we use the following generic identifiers: -* ****YOUR_CARDANO_NETWORK**** You need to replace this with the name of the network that runs on your Cardano node (eg, `preprod`) -* ****YOUR_AGGREGATOR_ENDPOINT**** You need to replace this with the endpoint of an aggregator that runs on the Cardano network you are targeting (eg, `https://aggregator.release-preprod.api.mithril.network/aggregator`) -* ****YOUR_GENESIS_VERIFICATION_KEY**** You need to replace this with the genesis verification key URL that runs on the Cardano network you are targeting (eg, `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey`) -* ****YOUR_ERA_READER_ADAPTER_TYPE**** You need to replace this with the era reader adapter type used by the Mithril network you are targeting (eg, `cardano-chain`) -* ****YOUR_ERA_READER_ADDRESS**** You need to replace this with the era reader address URL used by the Mithril network you are targeting (eg, `https://raw.githubusercontent.com/input-output-hk/mithril/main/address.addr`) -* ****YOUR_ERA_READER_VERIFICATION_KEY**** You need to replace this with the era reader verification key URL used by the Mithril network you are targeting (eg, `https://raw.githubusercontent.com/input-output-hk/mithril/main/TEST_ONLY_era.vkey`) +* ****YOUR_CARDANO_NETWORK**** Replace this with the name of the network that runs on your Cardano node (eg, `preprod`) +* ****YOUR_AGGREGATOR_ENDPOINT**** Replace this with the endpoint of an aggregator that runs on the Cardano network you are targeting (eg, `https://aggregator.release-preprod.api.mithril.network/aggregator`) +* ****YOUR_GENESIS_VERIFICATION_KEY**** Replace this with the genesis verification key URL that runs on the Cardano network you are targeting (eg, `https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey`) +* ****YOUR_ERA_READER_ADAPTER_TYPE**** Replace this with the era reader adapter type used by the Mithril network you are targeting (eg, `cardano-chain`) +* ****YOUR_ERA_READER_ADDRESS**** Replace this with the era reader address URL used by the Mithril network you are targeting (eg, `https://raw.githubusercontent.com/input-output-hk/mithril/main/address.addr`) +* ****YOUR_ERA_READER_VERIFICATION_KEY**** Replace this with the era reader verification key URL used by the Mithril network you are targeting (eg, `https://raw.githubusercontent.com/input-output-hk/mithril/main/TEST_ONLY_era.vkey`) ::: diff --git a/docs/website/yarn.lock b/docs/website/yarn.lock deleted file mode 100644 index 1b4a06da2b4..00000000000 --- a/docs/website/yarn.lock +++ /dev/null @@ -1,9865 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@algolia/autocomplete-core@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" - integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== - dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-plugin-algolia-insights@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" - integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-preset-algolia@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" - integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-shared@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" - integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== - -"@algolia/cache-browser-local-storage@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz#357318242fc542ffce41d6eb5b4a9b402921b0bb" - integrity sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ== - dependencies: - "@algolia/cache-common" "4.20.0" - -"@algolia/cache-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.20.0.tgz#ec52230509fce891091ffd0d890618bcdc2fa20d" - integrity sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ== - -"@algolia/cache-in-memory@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz#5f18d057bd6b3b075022df085c4f83bcca4e3e67" - integrity sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg== - dependencies: - "@algolia/cache-common" "4.20.0" - -"@algolia/client-account@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.20.0.tgz#23ce0b4cffd63100fb7c1aa1c67a4494de5bd645" - integrity sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q== - dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/client-search" "4.20.0" - "@algolia/transporter" "4.20.0" - -"@algolia/client-analytics@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.20.0.tgz#0aa6bef35d3a41ac3991b3f46fcd0bf00d276fa9" - integrity sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug== - dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/client-search" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" - -"@algolia/client-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.20.0.tgz#ca60f04466515548651c4371a742fbb8971790ef" - integrity sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ== - dependencies: - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" - -"@algolia/client-personalization@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.20.0.tgz#ca81308e8ad0db3b27458b78355f124f29657181" - integrity sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ== - dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" - -"@algolia/client-search@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.20.0.tgz#3bcce817ca6caedc835e0eaf6f580e02ee7c3e15" - integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== - dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@algolia/logger-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.20.0.tgz#f148ddf67e5d733a06213bebf7117cb8a651ab36" - integrity sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ== - -"@algolia/logger-console@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.20.0.tgz#ac443d27c4e94357f3063e675039cef0aa2de0a7" - integrity sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA== - dependencies: - "@algolia/logger-common" "4.20.0" - -"@algolia/requester-browser-xhr@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz#db16d0bdef018b93b51681d3f1e134aca4f64814" - integrity sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw== - dependencies: - "@algolia/requester-common" "4.20.0" - -"@algolia/requester-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.20.0.tgz#65694b2263a8712b4360fef18680528ffd435b5c" - integrity sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng== - -"@algolia/requester-node-http@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz#b52b182b52b0b16dec4070832267d484a6b1d5bb" - integrity sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng== - dependencies: - "@algolia/requester-common" "4.20.0" - -"@algolia/transporter@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.20.0.tgz#7e5b24333d7cc9a926b2f6a249f87c2889b944a9" - integrity sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg== - dependencies: - "@algolia/cache-common" "4.20.0" - "@algolia/logger-common" "4.20.0" - "@algolia/requester-common" "4.20.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== - -"@babel/core@^7.19.6", "@babel/core@^7.22.9": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7" - integrity sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.5" - "@babel/parser" "^7.23.5" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.5" - "@babel/types" "^7.23.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.22.9", "@babel/generator@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" - integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== - dependencies: - "@babel/types" "^7.23.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz#2a8792357008ae9ce8c0f2b78b9f646ac96b314b" - integrity sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - regexpu-core "^5.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" - integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== - dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" - -"@babel/helpers@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e" - integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.5" - "@babel/types" "^7.23.5" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" - integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" - integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" - integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.23.3" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" - integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@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-class-properties@^7.12.13": - 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-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" - integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-attributes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" - integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - 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.10.4": - 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-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - 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.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" - integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-async-generator-functions@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz#93ac8e3531f347fba519b4703f9ff2a75c6ae27a" - integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" - integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== - dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - -"@babel/plugin-transform-block-scoped-functions@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" - integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoping@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" - integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" - integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-static-block@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" - integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" - integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" - integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.15" - -"@babel/plugin-transform-destructuring@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" - integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dotall-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" - integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-duplicate-keys@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" - integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dynamic-import@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" - integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" - integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-export-namespace-from@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" - integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz#afe115ff0fbce735e02868d41489093c63e15559" - integrity sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" - integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== - dependencies: - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-json-strings@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" - integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" - integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-logical-assignment-operators@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" - integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" - integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-amd@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" - integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" - integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-modules-systemjs@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" - integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/plugin-transform-modules-umd@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" - integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-new-target@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" - integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" - integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" - integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" - integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== - dependencies: - "@babel/compat-data" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.23.3" - -"@babel/plugin-transform-object-super@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" - integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - -"@babel/plugin-transform-optional-catch-binding@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" - integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" - integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" - integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-methods@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" - integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-property-in-object@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" - integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" - integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz#5efc001d07ef0f7da0d73c3a86c132f73d28e43c" - integrity sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-display-name@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" - integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" - -"@babel/plugin-transform-react-pure-annotations@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" - integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-regenerator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" - integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-reserved-words@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" - integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-runtime@^7.22.9": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz#5132b388580002fc5cb7c84eccfb968acdc231cb" - integrity sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw== - dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" - integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-spread@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" - integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-sticky-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" - integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-template-literals@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" - integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typeof-symbol@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" - integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typescript@^7.23.3": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.5.tgz#83da13ef62a1ebddf2872487527094b31c9adb84" - integrity sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.23.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.23.3" - -"@babel/plugin-transform-unicode-escapes@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" - integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-property-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" - integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" - integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-sets-regex@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" - integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/preset-env@^7.19.4", "@babel/preset-env@^7.22.9": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.5.tgz#350a3aedfa9f119ad045b068886457e895ba0ca1" - integrity sha512-0d/uxVD6tFGWXGDSfyMD1p2otoaKmu6+GD+NfAx0tMaH+dxORnp7T9TaVQ6mKyya7iBtCIVxHjWT7MuzzM9z+A== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.23.3" - "@babel/plugin-syntax-import-attributes" "^7.23.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@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-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.4" - "@babel/plugin-transform-async-to-generator" "^7.23.3" - "@babel/plugin-transform-block-scoped-functions" "^7.23.3" - "@babel/plugin-transform-block-scoping" "^7.23.4" - "@babel/plugin-transform-class-properties" "^7.23.3" - "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.5" - "@babel/plugin-transform-computed-properties" "^7.23.3" - "@babel/plugin-transform-destructuring" "^7.23.3" - "@babel/plugin-transform-dotall-regex" "^7.23.3" - "@babel/plugin-transform-duplicate-keys" "^7.23.3" - "@babel/plugin-transform-dynamic-import" "^7.23.4" - "@babel/plugin-transform-exponentiation-operator" "^7.23.3" - "@babel/plugin-transform-export-namespace-from" "^7.23.4" - "@babel/plugin-transform-for-of" "^7.23.3" - "@babel/plugin-transform-function-name" "^7.23.3" - "@babel/plugin-transform-json-strings" "^7.23.4" - "@babel/plugin-transform-literals" "^7.23.3" - "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" - "@babel/plugin-transform-member-expression-literals" "^7.23.3" - "@babel/plugin-transform-modules-amd" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" - "@babel/plugin-transform-modules-umd" "^7.23.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" - "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.23.4" - "@babel/plugin-transform-object-super" "^7.23.3" - "@babel/plugin-transform-optional-catch-binding" "^7.23.4" - "@babel/plugin-transform-optional-chaining" "^7.23.4" - "@babel/plugin-transform-parameters" "^7.23.3" - "@babel/plugin-transform-private-methods" "^7.23.3" - "@babel/plugin-transform-private-property-in-object" "^7.23.4" - "@babel/plugin-transform-property-literals" "^7.23.3" - "@babel/plugin-transform-regenerator" "^7.23.3" - "@babel/plugin-transform-reserved-words" "^7.23.3" - "@babel/plugin-transform-shorthand-properties" "^7.23.3" - "@babel/plugin-transform-spread" "^7.23.3" - "@babel/plugin-transform-sticky-regex" "^7.23.3" - "@babel/plugin-transform-template-literals" "^7.23.3" - "@babel/plugin-transform-typeof-symbol" "^7.23.3" - "@babel/plugin-transform-unicode-escapes" "^7.23.3" - "@babel/plugin-transform-unicode-property-regex" "^7.23.3" - "@babel/plugin-transform-unicode-regex" "^7.23.3" - "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.22.5": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" - integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.23.3" - "@babel/plugin-transform-react-jsx" "^7.22.15" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.23.3" - -"@babel/preset-typescript@^7.18.6", "@babel/preset-typescript@^7.22.5": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" - integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-typescript" "^7.23.3" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime-corejs3@^7.22.6": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.5.tgz#818778beea4f23d40b77b5ad213894404c14f3f3" - integrity sha512-7+ziVclejQTLYhXl+Oi1f6gTGD1XDCeLa4R472TNGQxb08zbEJ0OdNoh5Piz+57Ltmui6xR88BXR4gS3/Toslw== - dependencies: - core-js-pure "^3.30.2" - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" - integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" - integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.5" - "@babel/types" "^7.23.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.5", "@babel/types@^7.4.4": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" - integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@braintree/sanitize-url@^6.0.1": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" - integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== - -"@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== - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@docsearch/css@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac" - integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== - -"@docsearch/react@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9" - integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== - dependencies: - "@algolia/autocomplete-core" "1.9.3" - "@algolia/autocomplete-preset-algolia" "1.9.3" - "@docsearch/css" "3.5.2" - algoliasearch "^4.19.1" - -"@docusaurus/core@3.0.0", "@docusaurus/core@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.0.0.tgz#46bc9bf2bcd99ca98a1c8f10a70bf3afaaaf9dcb" - integrity sha512-bHWtY55tJTkd6pZhHrWz1MpWuwN4edZe0/UWgFF7PW/oJeDZvLSXKqwny3L91X1/LGGoypBGkeZn8EOuKeL4yQ== - dependencies: - "@babel/core" "^7.22.9" - "@babel/generator" "^7.22.9" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.22.9" - "@babel/preset-env" "^7.22.9" - "@babel/preset-react" "^7.22.5" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@babel/runtime-corejs3" "^7.22.6" - "@babel/traverse" "^7.22.8" - "@docusaurus/cssnano-preset" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.5.1" - autoprefixer "^10.4.14" - babel-loader "^9.1.3" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.2" - cli-table3 "^0.6.3" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.31.1" - css-loader "^6.8.1" - css-minimizer-webpack-plugin "^4.2.2" - cssnano "^5.1.15" - del "^6.1.1" - detect-port "^1.5.1" - escape-html "^1.0.3" - eta "^2.2.0" - file-loader "^6.2.0" - fs-extra "^11.1.1" - html-minifier-terser "^7.2.0" - html-tags "^3.3.1" - html-webpack-plugin "^5.5.3" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.7.6" - postcss "^8.4.26" - postcss-loader "^7.3.3" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.4" - react-router-config "^5.1.1" - react-router-dom "^5.3.4" - rtl-detect "^1.0.4" - semver "^7.5.4" - serve-handler "^6.1.5" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.9" - tslib "^2.6.0" - update-notifier "^6.0.2" - url-loader "^4.1.1" - wait-on "^7.0.1" - webpack "^5.88.1" - webpack-bundle-analyzer "^4.9.0" - webpack-dev-server "^4.15.1" - webpack-merge "^5.9.0" - webpackbar "^5.0.2" - -"@docusaurus/cssnano-preset@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.0.tgz#87fbf9cbc7c383e207119b44c17fb1d05c73af7c" - integrity sha512-FHiRfwmVvIVdIGsHcijUOaX7hMn0mugVYB7m4GkpYI6Mi56zwQV4lH5p7DxcW5CUYNWMVxz2loWSCiWEm5ikwA== - dependencies: - cssnano-preset-advanced "^5.3.10" - postcss "^8.4.26" - postcss-sort-media-queries "^4.4.1" - tslib "^2.6.0" - -"@docusaurus/logger@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.0.0.tgz#02a4bfecec6aa3732c8bd9597ca9d5debab813a6" - integrity sha512-6eX0eOfioMQCk+qgCnHvbLLuyIAA+r2lSID6d6JusiLtDKmYMfNp3F4yyE8bnb0Abmzt2w68XwptEFYyALSAXw== - dependencies: - chalk "^4.1.2" - tslib "^2.6.0" - -"@docusaurus/mdx-loader@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.0.0.tgz#2593889e43dc4bbd8dfa074d86c8bb4206cf4171" - integrity sha512-JkGge6WYDrwjNgMxwkb6kNQHnpISt5L1tMaBWFDBKeDToFr5Kj29IL35MIQm0RfrnoOfr/29RjSH4aRtvlAR0A== - dependencies: - "@babel/parser" "^7.22.7" - "@babel/traverse" "^7.22.8" - "@docusaurus/logger" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - "@mdx-js/mdx" "^3.0.0" - "@slorber/remark-comment" "^1.0.0" - escape-html "^1.0.3" - estree-util-value-to-estree "^3.0.1" - file-loader "^6.2.0" - fs-extra "^11.1.1" - image-size "^1.0.2" - mdast-util-mdx "^3.0.0" - mdast-util-to-string "^4.0.0" - rehype-raw "^7.0.0" - remark-directive "^3.0.0" - remark-emoji "^4.0.0" - remark-frontmatter "^5.0.0" - remark-gfm "^4.0.0" - stringify-object "^3.3.0" - tslib "^2.6.0" - unified "^11.0.3" - unist-util-visit "^5.0.0" - url-loader "^4.1.1" - vfile "^6.0.1" - webpack "^5.88.1" - -"@docusaurus/module-type-aliases@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.0.tgz#9a7dd323bb87ca666eb4b0b4b90d04425f2e05d6" - integrity sha512-CfC6CgN4u/ce+2+L1JdsHNyBd8yYjl4De2B2CBj2a9F7WuJ5RjV1ciuU7KDg8uyju+NRVllRgvJvxVUjCdkPiw== - dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "3.0.0" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - -"@docusaurus/plugin-content-blog@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.0.tgz#5f3ede003b2b7103043918fbe3f436c116839ca8" - integrity sha512-iA8Wc3tIzVnROJxrbIsU/iSfixHW16YeW9RWsBw7hgEk4dyGsip9AsvEDXobnRq3lVv4mfdgoS545iGWf1Ip9w== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^11.1.1" - lodash "^4.17.21" - reading-time "^1.5.0" - srcset "^4.0.0" - tslib "^2.6.0" - unist-util-visit "^5.0.0" - utility-types "^3.10.0" - webpack "^5.88.1" - -"@docusaurus/plugin-content-docs@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.0.tgz#b579c65d7386905890043bdd4a8f9da3194e90fa" - integrity sha512-MFZsOSwmeJ6rvoZMLieXxPuJsA9M9vn7/mUZmfUzSUTeHAeq+fEqvLltFOxcj4DVVDTYlQhgWYd+PISIWgamKw== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - "@types/react-router-config" "^5.0.7" - combine-promises "^1.1.0" - fs-extra "^11.1.1" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.6.0" - utility-types "^3.10.0" - webpack "^5.88.1" - -"@docusaurus/plugin-content-pages@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.0.tgz#519a946a477a203989080db70dd787cb6db15fab" - integrity sha512-EXYHXK2Ea1B5BUmM0DgSwaOYt8EMSzWtYUToNo62Q/EoWxYOQFdWglYnw3n7ZEGyw5Kog4LHaRwlazAdmDomvQ== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - fs-extra "^11.1.1" - tslib "^2.6.0" - webpack "^5.88.1" - -"@docusaurus/plugin-debug@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.0.0.tgz#9c6d4abfd5357dbebccf5b41f5aefc06116e03e3" - integrity sha512-gSV07HfQgnUboVEb3lucuVyv5pEoy33E7QXzzn++3kSc/NLEimkjXh3sSnTGOishkxCqlFV9BHfY/VMm5Lko5g== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@microlink/react-json-view" "^1.22.2" - fs-extra "^11.1.1" - tslib "^2.6.0" - -"@docusaurus/plugin-google-analytics@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.0.tgz#8a54f5e21b55c133b6be803ac51bf92d4a515cca" - integrity sha512-0zcLK8w+ohmSm1fjUQCqeRsjmQc0gflvXnaVA/QVVCtm2yCiBtkrSGQXqt4MdpD7Xq8mwo3qVd5nhIcvrcebqw== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - tslib "^2.6.0" - -"@docusaurus/plugin-google-gtag@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.0.tgz#a4c407b80cb46773bea070816ebb547c5663f0b3" - integrity sha512-asEKavw8fczUqvXu/s9kG2m1epLnHJ19W6CCCRZEmpnkZUZKiM8rlkDiEmxApwIc2JDDbIMk+Y2TMkJI8mInbQ== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - "@types/gtag.js" "^0.0.12" - tslib "^2.6.0" - -"@docusaurus/plugin-google-tag-manager@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.0.tgz#8befa315b4747618e9ea65add3f2f4e84df2c7ba" - integrity sha512-lytgu2eyn+7p4WklJkpMGRhwC29ezj4IjPPmVJ8vGzcSl6JkR1sADTHLG5xWOMuci420xZl9dGEiLTQ8FjCRyA== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - tslib "^2.6.0" - -"@docusaurus/plugin-sitemap@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.0.tgz#91f300e500d476252ea2f40449ee828766b9b9d6" - integrity sha512-cfcONdWku56Oi7Hdus2uvUw/RKRRlIGMViiHLjvQ21CEsEqnQ297MRoIgjU28kL7/CXD/+OiANSq3T1ezAiMhA== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - fs-extra "^11.1.1" - sitemap "^7.1.1" - tslib "^2.6.0" - -"@docusaurus/preset-classic@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.0.0.tgz#b05c3960c4d0a731b2feb97e94e3757ab073c611" - integrity sha512-90aOKZGZdi0+GVQV+wt8xx4M4GiDrBRke8NO8nWwytMEXNrxrBxsQYFRD1YlISLJSCiHikKf3Z/MovMnQpnZyg== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/plugin-content-blog" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/plugin-content-pages" "3.0.0" - "@docusaurus/plugin-debug" "3.0.0" - "@docusaurus/plugin-google-analytics" "3.0.0" - "@docusaurus/plugin-google-gtag" "3.0.0" - "@docusaurus/plugin-google-tag-manager" "3.0.0" - "@docusaurus/plugin-sitemap" "3.0.0" - "@docusaurus/theme-classic" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/theme-search-algolia" "3.0.0" - "@docusaurus/types" "3.0.0" - -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.0.0.tgz#a47eda40747e1a6f79190e6bb786d3a7fc4e06b2" - integrity sha512-wWOHSrKMn7L4jTtXBsb5iEJ3xvTddBye5PjYBnWiCkTAlhle2yMdc4/qRXW35Ot+OV/VXu6YFG8XVUJEl99z0A== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/plugin-content-blog" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/plugin-content-pages" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/theme-translations" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - "@mdx-js/react" "^3.0.0" - clsx "^1.2.1" - copy-text-to-clipboard "^3.2.0" - infima "0.2.0-alpha.43" - lodash "^4.17.21" - nprogress "^0.2.0" - postcss "^8.4.26" - prism-react-renderer "^2.1.0" - prismjs "^1.29.0" - react-router-dom "^5.3.4" - rtlcss "^4.1.0" - tslib "^2.6.0" - utility-types "^3.10.0" - -"@docusaurus/theme-common@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.0.0.tgz#6dc8c39a7458dd39f95a2fa6eb1c6aaf32b7e103" - integrity sha512-PahRpCLRK5owCMEqcNtUeTMOkTUCzrJlKA+HLu7f+8osYOni617YurXvHASCsSTxurjXaLz/RqZMnASnqATxIA== - dependencies: - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/plugin-content-blog" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/plugin-content-pages" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^2.1.0" - tslib "^2.6.0" - utility-types "^3.10.0" - -"@docusaurus/theme-mermaid@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.0.0.tgz#5b1a5ea53d99edd8839ec49076b148007a388ccb" - integrity sha512-e5uoGmow5kk5AeiyYFHYGsM5LFg4ClCIIQQcBrD9zs1E8yxTDNX524MylO6klqqCn3TmxJ34RogEg78QnthRng== - dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - mermaid "^10.4.0" - tslib "^2.6.0" - -"@docusaurus/theme-search-algolia@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.0.tgz#20701c2e7945a236df401365271b511a24ff3cad" - integrity sha512-PyMUNIS9yu0dx7XffB13ti4TG47pJq3G2KE/INvOFb6M0kWh+wwCnucPg4WAOysHOPh+SD9fjlXILoLQstgEIA== - dependencies: - "@docsearch/react" "^3.5.2" - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/theme-translations" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" - algoliasearch "^4.18.0" - algoliasearch-helper "^3.13.3" - clsx "^1.2.1" - eta "^2.2.0" - fs-extra "^11.1.1" - lodash "^4.17.21" - tslib "^2.6.0" - utility-types "^3.10.0" - -"@docusaurus/theme-translations@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.0.0.tgz#98590b80589f15b2064e0daa2acc3a82d126f53b" - integrity sha512-p/H3+5LdnDtbMU+csYukA6601U1ld2v9knqxGEEV96qV27HsHfP63J9Ta2RBZUrNhQAgrwFzIc9GdDO8P1Baag== - dependencies: - fs-extra "^11.1.1" - tslib "^2.6.0" - -"@docusaurus/types@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.0.0.tgz#3edabe43f70b45f81a48f3470d6a73a2eba41945" - integrity sha512-Qb+l/hmCOVemReuzvvcFdk84bUmUFyD0Zi81y651ie3VwMrXqC7C0E7yZLKMOsLj/vkqsxHbtkAuYMI89YzNzg== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - commander "^5.1.0" - joi "^17.9.2" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.88.1" - webpack-merge "^5.9.0" - -"@docusaurus/utils-common@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.0.0.tgz#fb019e5228b20852a5b98f50672a02843a03ba03" - integrity sha512-7iJWAtt4AHf4PFEPlEPXko9LZD/dbYnhLe0q8e3GRK1EXZyRASah2lznpMwB3lLmVjq/FR6ZAKF+E0wlmL5j0g== - dependencies: - tslib "^2.6.0" - -"@docusaurus/utils-validation@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.0.0.tgz#56f3ba89ceba9826989408a96827897c0b724612" - integrity sha512-MlIGUspB/HBW5CYgHvRhmkZbeMiUWKbyVoCQYvbGN8S19SSzVgzyy97KRpcjCOYYeEdkhmRCUwFBJBlLg3IoNQ== - dependencies: - "@docusaurus/logger" "3.0.0" - "@docusaurus/utils" "3.0.0" - joi "^17.9.2" - js-yaml "^4.1.0" - tslib "^2.6.0" - -"@docusaurus/utils@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.0.0.tgz#2ef0c8e434036fe104dca4c694fd50022b2ba1ed" - integrity sha512-JwGjh5mtjG9XIAESyPxObL6CZ6LO/yU4OSTpq7Q0x+jN25zi/AMbvLjpSyZzWy+qm5uQiFiIhqFaOxvy+82Ekg== - dependencies: - "@docusaurus/logger" "3.0.0" - "@svgr/webpack" "^6.5.1" - escape-string-regexp "^4.0.0" - file-loader "^6.2.0" - fs-extra "^11.1.1" - github-slugger "^1.5.0" - globby "^11.1.0" - gray-matter "^4.0.3" - jiti "^1.20.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.6.0" - url-loader "^4.1.1" - webpack "^5.88.1" - -"@emotion/is-prop-valid@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/unitless@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@exodus/schemasafe@^1.0.0-rc.2": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" - integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== - -"@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/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" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.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.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@mdx-js/mdx@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.0.tgz#37ef87685143fafedf1165f0a79e9fe95fbe5154" - integrity sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw== - dependencies: - "@types/estree" "^1.0.0" - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdx" "^2.0.0" - collapse-white-space "^2.0.0" - devlop "^1.0.0" - estree-util-build-jsx "^3.0.0" - estree-util-is-identifier-name "^3.0.0" - estree-util-to-js "^2.0.0" - estree-walker "^3.0.0" - hast-util-to-estree "^3.0.0" - hast-util-to-jsx-runtime "^2.0.0" - markdown-extensions "^2.0.0" - periscopic "^3.0.0" - remark-mdx "^3.0.0" - remark-parse "^11.0.0" - remark-rehype "^11.0.0" - source-map "^0.7.0" - unified "^11.0.0" - unist-util-position-from-estree "^2.0.0" - unist-util-stringify-position "^4.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.0" - -"@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/react@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.0.0.tgz#eaccaa8d6a7736b19080aff5a70448a7ba692271" - integrity sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ== - dependencies: - "@types/mdx" "^2.0.0" - -"@microlink/react-json-view@^1.22.2": - version "1.23.0" - resolved "https://registry.yarnpkg.com/@microlink/react-json-view/-/react-json-view-1.23.0.tgz#641c2483b1a0014818303d4e9cce634d5dacc7e9" - integrity sha512-HYJ1nsfO4/qn8afnAMhuk7+5a1vcjEaS8Gm5Vpr1SqdHDY0yLBJGpA+9DvKyxyVKaUkXzKXt3Mif9RcmFSdtYg== - dependencies: - flux "~4.0.1" - react-base16-styling "~0.6.0" - react-lifecycles-compat "~3.0.4" - react-textarea-autosize "~8.3.2" - -"@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": - 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" - -"@pnpm/config.env-replace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" - integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== - -"@pnpm/network.ca-file@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" - integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== - dependencies: - graceful-fs "4.2.10" - -"@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== - dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" - config-chain "^1.1.11" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.23" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" - integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== - -"@redocly/ajv@^8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.0.tgz#2fad322888dc0113af026e08fceb3e71aae495ae" - integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -"@redocly/openapi-core@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.4.0.tgz#d1ce8e391b32452082f754315c8eb265690b784f" - integrity sha512-M4f0H3XExPvJ0dwbEou7YKLzkpz2ZMS9JoNvrbEECO7WCwjGZ4AjbiUjp2p0ZzFMNIiNgTVUJJmkxGxsXW471Q== - dependencies: - "@redocly/ajv" "^8.11.0" - "@types/node" "^14.11.8" - colorette "^1.2.0" - js-levenshtein "^1.1.6" - js-yaml "^4.1.0" - lodash.isequal "^4.5.0" - minimatch "^5.0.1" - node-fetch "^2.6.1" - pluralize "^8.0.0" - yaml-ast-parser "0.0.43" - -"@redocly/openapi-core@^1.0.0-rc.2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.5.0.tgz#aacdb9030a041a53e38c9b5c51b1caa25ab7957b" - integrity sha512-AnDLoDl1+a7mZO4+lx0KG8zH04BQx4ez6yh403PuNl9/0ygbicPPc9QG/y0/0OImChOA+knKLpJazNFjzhOAeg== - dependencies: - "@redocly/ajv" "^8.11.0" - "@types/node" "^14.11.8" - colorette "^1.2.0" - js-levenshtein "^1.1.6" - js-yaml "^4.1.0" - lodash.isequal "^4.5.0" - minimatch "^5.0.1" - node-fetch "^2.6.1" - pluralize "^8.0.0" - yaml-ast-parser "0.0.43" - -"@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.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@sindresorhus/is@^5.2.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" - integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== - -"@slorber/remark-comment@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" - integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.1.0" - micromark-util-symbol "^1.0.1" - -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - -"@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 "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@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.5.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" - -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== - dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@svgr/webpack@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== - dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@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/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" - integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" - integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/d3-scale-chromatic@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" - integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== - -"@types/d3-scale@^4.0.3": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" - integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== - dependencies: - "@types/d3-time" "*" - -"@types/d3-time@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" - integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== - -"@types/debug@^4.0.0": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.44.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" - integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree-jsx@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.3.tgz#f8aa833ec986d82b8271a294a92ed1565bf2c66a" - integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== - dependencies: - "@types/estree" "*" - -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.41" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" - integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/gtag.js@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" - integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== - -"@types/hast@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" - integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== - dependencies: - "@types/unist" "*" - -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-cache-semantics@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/http-proxy@^1.17.8": - version "1.17.14" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" - integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== - dependencies: - "@types/unist" "^2" - -"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" - integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== - dependencies: - "@types/unist" "*" - -"@types/mdx@^2.0.0": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.10.tgz#0d7b57fb1d83e27656156e4ee0dfba96532930e4" - integrity sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg== - -"@types/mime@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" - integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - -"@types/node-forge@^1.3.0": - version "1.3.10" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" - integrity sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "20.10.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" - integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== - dependencies: - undici-types "~5.26.4" - -"@types/node@^14.11.8": - version "14.18.63" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" - integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== - -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prismjs@^1.26.0": - version "1.26.3" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.3.tgz#47fe8e784c2dee24fe636cab82e090d3da9b7dec" - integrity sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw== - -"@types/prop-types@*": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== - -"@types/qs@*": - version "6.9.10" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.10.tgz#0af26845b5067e1c9a622658a51f60a3934d51e8" - integrity sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/react-router-config@*", "@types/react-router-config@^5.0.7": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.10.tgz#1f7537b8d23ad6bb8e7609268fdd89b8b2de1eaf" - integrity sha512-Wn6c/tXdEgi9adCMtDwx8Q2vGty6TsPTc/wCQQ9kAlye8UqFxj0vGFWWuhywNfkwqth+SOgJxQTLTZukrqDQmQ== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "^5.1.0" - -"@types/react-router-dom@*": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*", "@types/react-router@^5.1.0": - version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" - integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - -"@types/react@*": - version "18.2.39" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.39.tgz#744bee99e053ad61fe74eb8b897f3ab5b19a7e25" - integrity sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/sax@^1.2.1": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" - integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.4" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" - integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" - integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== - dependencies: - "@types/http-errors" "*" - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" - integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== - dependencies: - "@types/node" "*" - -"@types/stylis@^4.0.2": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.4.tgz#14b61f022e832d87d442ae1795e0f0f0b7daa879" - integrity sha512-36ZrGJ8fgtBr6nwNnuJ9jXIj+bn/pF6UoqmrQT7+Y99+tFFeHHsoR54+194dHdyhPjgbeoNz3Qru0oRt0l6ASQ== - -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" - integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== - -"@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== - -"@types/ws@^8.5.5": - version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" - integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== - dependencies: - "@types/yargs-parser" "*" - -"@ungap/structured-clone@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, 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-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: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" - integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== - -acorn@^8.0.0, acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -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-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.5: - 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" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -algoliasearch-helper@^3.13.3: - version "3.15.0" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz#d680783329920a3619a74504dccb97a4fb943443" - integrity sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA== - dependencies: - "@algolia/events" "^4.0.1" - -algoliasearch@^4.18.0, algoliasearch@^4.19.1: - version "4.20.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.20.0.tgz#700c2cb66e14f8a288460036c7b2a554d0d93cf4" - integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== - dependencies: - "@algolia/cache-browser-local-storage" "4.20.0" - "@algolia/cache-common" "4.20.0" - "@algolia/cache-in-memory" "4.20.0" - "@algolia/client-account" "4.20.0" - "@algolia/client-analytics" "4.20.0" - "@algolia/client-common" "4.20.0" - "@algolia/client-personalization" "4.20.0" - "@algolia/client-search" "4.20.0" - "@algolia/logger-common" "4.20.0" - "@algolia/logger-console" "4.20.0" - "@algolia/requester-browser-xhr" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/requester-node-http" "4.20.0" - "@algolia/transporter" "4.20.0" - -ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.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" - -arg@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -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== - -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-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -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== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -astring@^1.8.0: - version "1.8.6" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" - integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== - -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== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.14: - version "10.4.16" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== - dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -axios@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-loader@^9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" - integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== - dependencies: - find-cache-dir "^4.0.0" - schema-utils "^4.0.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-polyfill-corejs2@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" - integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.3" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.8.5: - version "0.8.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" - integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" - core-js-compat "^3.33.1" - -babel-plugin-polyfill-regenerator@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" - integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" - -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== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -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== - -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" - -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" - integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== - dependencies: - ansi-align "^3.0.1" - camelcase "^6.2.0" - chalk "^4.1.2" - cli-boxes "^3.0.0" - string-width "^5.0.1" - type-fest "^2.5.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - -boxen@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" - integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== - dependencies: - ansi-align "^3.0.1" - camelcase "^7.0.1" - chalk "^5.2.0" - cli-boxes "^3.0.0" - string-width "^5.1.2" - type-fest "^2.13.0" - widest-line "^4.0.1" - wrap-ansi "^8.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== - dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - -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== - -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== - -cacheable-lookup@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" - integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== - -cacheable-request@^10.2.8: - version "10.2.14" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" - integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== - dependencies: - "@types/http-cache-semantics" "^4.0.2" - get-stream "^6.0.1" - http-cache-semantics "^4.1.1" - keyv "^4.5.3" - mimic-response "^4.0.0" - normalize-url "^8.0.0" - responselike "^3.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== - dependencies: - function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" - -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - -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== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelcase@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" - integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001565" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz#a528b253c8a2d95d2b415e11d8b9942acc100c4f" - integrity sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w== - -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.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@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.0.1, chalk@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -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@^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@^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@^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== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.12: - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@^3.4.2, chokidar@^3.5.3: - 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" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -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-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-table3@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.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" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clsx@^1.1.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== - -clsx@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - -collapse-white-space@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" - integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== - -color-convert@^1.9.0: - 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.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== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combine-promises@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" - integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -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@7, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -configstore@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" - integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== - dependencies: - dot-prop "^6.0.1" - graceful-fs "^4.2.6" - unique-string "^3.0.0" - write-file-atomic "^3.0.3" - xdg-basedir "^5.0.1" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -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.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-text-to-clipboard@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" - integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -copyfiles@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - -core-js-compat@^3.31.0, core-js-compat@^3.33.1: - version "3.33.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.3.tgz#ec678b772c5a2d8a7c60a91c3a81869aa704ae01" - integrity sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow== - dependencies: - browserslist "^4.22.1" - -core-js-pure@^3.30.2: - version "3.33.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.3.tgz#cbf9180ac4c4653823d784862bfb5c77eac0bf98" - integrity sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ== - -core-js@^3.31.1: - version "3.33.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.3.tgz#3c644a323f0f533a0d360e9191e37f7fc059088d" - integrity sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cose-base@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" - integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== - dependencies: - layout-base "^1.0.0" - -cose-base@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" - integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== - dependencies: - layout-base "^2.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -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" - -cosmiconfig@^8.2.0: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.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" - -crypto-random-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" - integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== - dependencies: - type-fest "^1.0.1" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-declaration-sorter@^6.3.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" - integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== - -css-loader@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== - dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-to-react-native@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@^1.1.2, css-tree@^1.1.3: - 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-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-advanced@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.1.15, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2, csstype@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -cytoscape-cose-bilkent@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" - integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== - dependencies: - cose-base "^1.0.0" - -cytoscape-fcose@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" - integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== - dependencies: - cose-base "^2.2.0" - -cytoscape@^3.23.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.27.0.tgz#5141cd694570807c91075b609181bce102e0bb88" - integrity sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg== - dependencies: - heap "^0.2.6" - lodash "^4.17.21" - -"d3-array@1 - 2": - version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" - integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== - dependencies: - internmap "^1.0.0" - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" - integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== - dependencies: - internmap "1 - 2" - -d3-axis@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" - integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== - -d3-brush@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" - integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" - integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== - dependencies: - d3-path "1 - 3" - -"d3-color@1 - 3", d3-color@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-contour@4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" - integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.4" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" - integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== - dependencies: - delaunator "5" - -"d3-dispatch@1 - 3", d3-dispatch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" - integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -"d3-dsv@1 - 3", d3-dsv@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -"d3-ease@1 - 3", d3-ease@3: - 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-fetch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" - integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== - dependencies: - d3-dsv "1 - 3" - -d3-force@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-format@1 - 3", d3-format@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-geo@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - 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@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -"d3-path@1 - 3", d3-path@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-polygon@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" - integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-random@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" - integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== - -d3-sankey@^0.12.3: - version "0.12.3" - resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" - integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== - dependencies: - d3-array "1 - 2" - d3-shape "^1.2.0" - -d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" - integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@4: - 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-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" - integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== - -d3-shape@3: - 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-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -"d3-time-format@2 - 4", d3-time-format@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: - 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@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" - integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" - integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^7.4.0, d3@^7.8.2: - version "7.8.5" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.5.tgz#fde4b760d4486cdb6f0cc8e2cbff318af844635c" - integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA== - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -dagre-d3-es@7.0.10: - version "7.0.10" - resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" - integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== - dependencies: - d3 "^7.8.2" - lodash-es "^4.17.21" - -dayjs@^1.11.7: - version "1.11.10" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@2.6.9, debug@^2.6.0: - 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.0.0, debug@^4.1.0, debug@^4.1.1: - 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" - -decko@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" - integrity sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ== - -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" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -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.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.0: - 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-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -devlop@^1.0.0, devlop@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" - integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== - dependencies: - dequal "^2.0.0" - -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" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -docusaurus-plugin-redoc@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.0.0.tgz#2f7b2ee9fd4beb86cdc2d88efd9ba87b76752484" - integrity sha512-+cUy/wnQVQmuygMxP0gAWODzo502QruhyUTHShxMEBhkL57dOx0COMgd8Iu4BlqiW9RGzN3hEZEpLzGTaGFOtQ== - dependencies: - "@redocly/openapi-core" "1.4.0" - redoc "2.1.3" - -docusaurus-theme-redoc@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.0.0.tgz#2cbae0f51f1c1f9527069e54173cfdb184d4a995" - integrity sha512-BOew0bVJvc8LV+zMMURx/2pWkk8VQNY2Wow2AFVSCGCkHi4UMwpq50VFL42t0MF6EnoSY9hqArqNfofpUFiiOw== - dependencies: - "@redocly/openapi-core" "1.4.0" - clsx "^1.2.1" - copyfiles "^2.4.1" - lodash "^4.17.21" - mobx "^6.10.2" - redoc "2.1.3" - styled-components "^6.1.0" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@^2.2.8: - version "2.4.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== - -dompurify@^3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.6.tgz#925ebd576d54a9531b5d76f0a5bef32548351dae" - integrity sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w== - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - -duplexer@^0.1.2: - 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== - -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== - -electron-to-chromium@^1.4.535: - version "1.4.596" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.596.tgz#6752d1aa795d942d49dfc5d3764d6ea283fab1d7" - integrity sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg== - -elkjs@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" - integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== - -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== - -emojilib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" - integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -emoticon@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.0.1.tgz#2d2bbbf231ce3a5909e185bbb64a9da703a1e749" - integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== - -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== - -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-module-lexer@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== - -es6-promise@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== - -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-goat@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" - integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== - -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@^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== - -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" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -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: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" - integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== - dependencies: - "@types/estree" "^1.0.0" - -estree-util-build-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" - integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== - dependencies: - "@types/estree-jsx" "^1.0.0" - devlop "^1.0.0" - estree-util-is-identifier-name "^3.0.0" - estree-walker "^3.0.0" - -estree-util-is-identifier-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" - integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== - -estree-util-to-js@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" - integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== - dependencies: - "@types/estree-jsx" "^1.0.0" - astring "^1.8.0" - source-map "^0.7.0" - -estree-util-value-to-estree@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz#0b7b5d6b6a4aaad5c60999ffbc265a985df98ac5" - integrity sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA== - dependencies: - "@types/estree" "^1.0.0" - is-plain-obj "^4.0.0" - -estree-util-visit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" - integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/unist" "^3.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== - -eta@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" - integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== - -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== - -eval@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" - integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== - dependencies: - "@types/node" "*" - require-like ">= 0.1.1" - -eventemitter3@^4.0.0, eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -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" - -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@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - 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.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-safe-stringify@^2.0.7: - 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-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fault@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" - integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== - dependencies: - format "^0.2.0" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - -feed@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" - integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== - dependencies: - xml-js "^1.6.11" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -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-cache-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" - integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== - dependencies: - common-path-prefix "^3.0.0" - pkg-dir "^7.0.0" - -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@^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" - -find-up@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" - integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== - dependencies: - locate-path "^7.1.0" - path-exists "^5.0.0" - -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== - -flux@~4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== - -foreach@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" - integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -form-data-encoder@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" - integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== - -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" - -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== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.3.6: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -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-extra@^11.1.1: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -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.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -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== - -github-slugger@^1.5.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== - -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.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.6: - 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" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.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== - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.1: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@^12.1.0: - version "12.6.1" - resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" - integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== - dependencies: - "@sindresorhus/is" "^5.2.0" - "@szmarczak/http-timer" "^5.0.1" - cacheable-lookup "^7.0.0" - cacheable-request "^10.2.8" - decompress-response "^6.0.0" - form-data-encoder "^2.1.2" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^3.0.0" - -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -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" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -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.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== - dependencies: - get-intrinsic "^1.2.2" - -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.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-yarn@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" - integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -hast-util-from-parse5@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" - integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - devlop "^1.0.0" - hastscript "^8.0.0" - property-information "^6.0.0" - vfile "^6.0.0" - vfile-location "^5.0.0" - web-namespaces "^2.0.0" - -hast-util-parse-selector@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" - integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== - dependencies: - "@types/hast" "^3.0.0" - -hast-util-raw@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" - integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - "@ungap/structured-clone" "^1.0.0" - hast-util-from-parse5 "^8.0.0" - hast-util-to-parse5 "^8.0.0" - html-void-elements "^3.0.0" - mdast-util-to-hast "^13.0.0" - parse5 "^7.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-to-estree@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" - integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== - dependencies: - "@types/estree" "^1.0.0" - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - comma-separated-tokens "^2.0.0" - devlop "^1.0.0" - estree-util-attach-comments "^3.0.0" - estree-util-is-identifier-name "^3.0.0" - hast-util-whitespace "^3.0.0" - mdast-util-mdx-expression "^2.0.0" - mdast-util-mdx-jsx "^3.0.0" - mdast-util-mdxjs-esm "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" - unist-util-position "^5.0.0" - zwitch "^2.0.0" - -hast-util-to-jsx-runtime@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz#ffd59bfcf0eb8321c6ed511bfc4b399ac3404bc2" - integrity sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^3.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" - unist-util-position "^5.0.0" - vfile-message "^4.0.0" - -hast-util-to-parse5@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" - integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== - dependencies: - "@types/hast" "^3.0.0" - comma-separated-tokens "^2.0.0" - devlop "^1.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-whitespace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" - integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== - dependencies: - "@types/hast" "^3.0.0" - -hastscript@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" - integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== - dependencies: - "@types/hast" "^3.0.0" - comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^4.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -heap@^0.2.6: - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@^3.1.0: - 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" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== - -html-escaper@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-minifier-terser@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" - integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== - dependencies: - camel-case "^4.1.2" - clean-css "~5.3.2" - commander "^10.0.0" - entities "^4.4.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.15.1" - -html-tags@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-void-elements@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" - integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== - -html-webpack-plugin@^5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" - integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -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-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http2-client@^1.2.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" - integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== - -http2-wrapper@^2.1.10: - version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -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== - -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: - 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" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== - -image-size@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - 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-lazy@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -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== - -infima@0.2.0-alpha.43: - version "0.2.0-alpha.43" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" - integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== - -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.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -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== - -"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== - -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -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" - -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== - -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -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@^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-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-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-ci@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -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-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: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -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-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@^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-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-npm@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" - integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== - -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-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - 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.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-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-reference@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" - integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== - dependencies: - "@types/estree" "*" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -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-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-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" - -is-yarn-global@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" - integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -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== - -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@^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== - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.1.2: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jiti@^1.18.2, jiti@^1.20.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -joi@^17.11.0, joi@^17.9.2: - version "17.11.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" - integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== - 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-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - 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-pointer@0.6.2, json-pointer@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" - integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== - dependencies: - foreach "^2.0.4" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -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" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -khroma@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" - integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== - -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== - -latest-version@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" - integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== - dependencies: - package-json "^8.1.0" - -launch-editor@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" - integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.8.1" - -layout-base@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" - integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== - -layout-base@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" - integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== - -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== - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -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@^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" - -locate-path@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.curry@^4.0.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.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.isequal@^4.5.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.1.2: - 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.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -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.2.0, loose-envify@^1.3.1, 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" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -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" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -mark.js@^8.11.1: - version "8.11.1" - resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" - integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== - -markdown-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" - integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== - -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== - -marked@^4.0.15: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - -mdast-util-directive@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" - integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - parse-entities "^4.0.0" - stringify-entities "^4.0.0" - unist-util-visit-parents "^6.0.0" - -mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" - integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== - dependencies: - "@types/mdast" "^4.0.0" - escape-string-regexp "^5.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -mdast-util-from-markdown@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== - 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-from-markdown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" - integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - mdast-util-to-string "^4.0.0" - micromark "^4.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-decode-string "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-stringify-position "^4.0.0" - -mdast-util-frontmatter@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" - integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - escape-string-regexp "^5.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - micromark-extension-frontmatter "^2.0.0" - -mdast-util-gfm-autolink-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" - integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== - dependencies: - "@types/mdast" "^4.0.0" - ccount "^2.0.0" - devlop "^1.0.0" - mdast-util-find-and-replace "^3.0.0" - micromark-util-character "^2.0.0" - -mdast-util-gfm-footnote@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" - integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.1.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - -mdast-util-gfm-strikethrough@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" - integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" - integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm-task-list-item@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" - integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== - dependencies: - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-gfm@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" - integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== - dependencies: - mdast-util-from-markdown "^2.0.0" - mdast-util-gfm-autolink-literal "^2.0.0" - mdast-util-gfm-footnote "^2.0.0" - mdast-util-gfm-strikethrough "^2.0.0" - mdast-util-gfm-table "^2.0.0" - mdast-util-gfm-task-list-item "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-mdx-expression@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" - integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-mdx-jsx@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz#f73631fa5bb7a36712ff1e9cedec0cafed03401c" - integrity sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - ccount "^2.0.0" - devlop "^1.1.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - parse-entities "^4.0.0" - stringify-entities "^4.0.0" - unist-util-remove-position "^5.0.0" - unist-util-stringify-position "^4.0.0" - vfile-message "^4.0.0" - -mdast-util-mdx@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" - integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== - dependencies: - mdast-util-from-markdown "^2.0.0" - mdast-util-mdx-expression "^2.0.0" - mdast-util-mdx-jsx "^3.0.0" - mdast-util-mdxjs-esm "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-mdxjs-esm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" - integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== - dependencies: - "@types/estree-jsx" "^1.0.0" - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - devlop "^1.0.0" - mdast-util-from-markdown "^2.0.0" - mdast-util-to-markdown "^2.0.0" - -mdast-util-phrasing@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" - integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== - dependencies: - "@types/mdast" "^4.0.0" - unist-util-is "^6.0.0" - -mdast-util-to-hast@^13.0.0: - version "13.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" - integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@ungap/structured-clone" "^1.0.0" - devlop "^1.0.0" - micromark-util-sanitize-uri "^2.0.0" - trim-lines "^3.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - -mdast-util-to-markdown@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" - integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== - dependencies: - "@types/mdast" "^4.0.0" - "@types/unist" "^3.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^4.0.0" - mdast-util-to-string "^4.0.0" - micromark-util-decode-string "^2.0.0" - unist-util-visit "^5.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== - dependencies: - "@types/mdast" "^3.0.0" - -mdast-util-to-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" - integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== - dependencies: - "@types/mdast" "^4.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== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -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== - -mermaid@^10.4.0: - version "10.6.1" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.6.1.tgz#701f4160484137a417770ce757ce1887a98c00fc" - integrity sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A== - dependencies: - "@braintree/sanitize-url" "^6.0.1" - "@types/d3-scale" "^4.0.3" - "@types/d3-scale-chromatic" "^3.0.0" - cytoscape "^3.23.0" - cytoscape-cose-bilkent "^4.1.0" - cytoscape-fcose "^2.1.0" - d3 "^7.4.0" - d3-sankey "^0.12.3" - dagre-d3-es "7.0.10" - dayjs "^1.11.7" - dompurify "^3.0.5" - elkjs "^0.8.2" - khroma "^2.0.0" - lodash-es "^4.17.21" - mdast-util-from-markdown "^1.3.0" - non-layered-tidy-tree-layout "^2.0.2" - stylis "^4.1.3" - ts-dedent "^2.2.0" - uuid "^9.0.0" - web-worker "^1.2.0" - -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.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== - 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-core-commonmark@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" - integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== - dependencies: - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-factory-destination "^2.0.0" - micromark-factory-label "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-factory-title "^2.0.0" - micromark-factory-whitespace "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-html-tag-name "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-directive@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz#527869de497a6de9024138479091bc885dae076b" - integrity sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-factory-whitespace "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - parse-entities "^4.0.0" - -micromark-extension-frontmatter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" - integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== - dependencies: - fault "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-autolink-literal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" - integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-footnote@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" - integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== - dependencies: - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-strikethrough@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" - integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== - dependencies: - devlop "^1.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" - integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm-tagfilter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" - integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== - dependencies: - micromark-util-types "^2.0.0" - -micromark-extension-gfm-task-list-item@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" - integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== - dependencies: - devlop "^1.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-gfm@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" - integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== - dependencies: - micromark-extension-gfm-autolink-literal "^2.0.0" - micromark-extension-gfm-footnote "^2.0.0" - micromark-extension-gfm-strikethrough "^2.0.0" - micromark-extension-gfm-table "^2.0.0" - micromark-extension-gfm-tagfilter "^2.0.0" - micromark-extension-gfm-task-list-item "^2.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-mdx-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" - integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - micromark-factory-mdx-expression "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-extension-mdx-jsx@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" - integrity sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== - dependencies: - "@types/acorn" "^4.0.0" - "@types/estree" "^1.0.0" - devlop "^1.0.0" - estree-util-is-identifier-name "^3.0.0" - micromark-factory-mdx-expression "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - vfile-message "^4.0.0" - -micromark-extension-mdx-md@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" - integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== - dependencies: - micromark-util-types "^2.0.0" - -micromark-extension-mdxjs-esm@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" - integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-position-from-estree "^2.0.0" - vfile-message "^4.0.0" - -micromark-extension-mdxjs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" - integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== - dependencies: - acorn "^8.0.0" - acorn-jsx "^5.0.0" - micromark-extension-mdx-expression "^3.0.0" - micromark-extension-mdx-jsx "^3.0.0" - micromark-extension-mdx-md "^2.0.0" - micromark-extension-mdxjs-esm "^3.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-destination@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" - integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== - 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-label@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" - integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== - dependencies: - devlop "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-mdx-expression@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" - integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== - dependencies: - "@types/estree" "^1.0.0" - devlop "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-events-to-acorn "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - unist-util-position-from-estree "^2.0.0" - vfile-message "^4.0.0" - -micromark-factory-space@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" - integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-space@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" - integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== - 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-factory-title@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" - integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== - dependencies: - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== - 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-factory-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" - integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== - dependencies: - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" - integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" - integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== - dependencies: - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-chunked@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" - integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-classify-character@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" - integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" - integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== - dependencies: - micromark-util-chunked "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-numeric-character-reference@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" - integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== - 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-decode-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" - integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^2.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== - -micromark-util-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" - integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== - -micromark-util-events-to-acorn@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" - integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== - dependencies: - "@types/acorn" "^4.0.0" - "@types/estree" "^1.0.0" - "@types/unist" "^3.0.0" - devlop "^1.0.0" - estree-util-visit "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - vfile-message "^4.0.0" - -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== - -micromark-util-html-tag-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" - integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== - -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-normalize-identifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" - integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== - dependencies: - micromark-util-symbol "^2.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-resolve-all@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" - integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== - dependencies: - micromark-util-types "^2.0.0" - -micromark-util-sanitize-uri@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-sanitize-uri@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" - integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== - 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-subtokenize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" - integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== - dependencies: - devlop "^1.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" - integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== - -micromark-util-symbol@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" - integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" - integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== - -micromark-util-types@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" - integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== - -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== - 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" - -micromark@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" - integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-combine-extensions "^2.0.0" - micromark-util-decode-numeric-character-reference "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -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" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, 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== - -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-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -mimic-response@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" - integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== - -mini-css-extract-plugin@^2.7.6: - version "2.7.6" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" - integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== - dependencies: - schema-utils "^4.0.0" - -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.1.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - 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" - -minimist@^1.2.0, minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mobx-react-lite@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz#3a4c22c30bfaa8b1b2aa48d12b2ba811c0947ab7" - integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== - -mobx-react@^7.2.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.6.0.tgz#ebf0456728a9bd2e5c24fdcf9b36e285a222a7d6" - integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== - dependencies: - mobx-react-lite "^3.4.0" - -mobx@^6.10.2: - version "6.12.0" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.12.0.tgz#72b2685ca5af031aaa49e77a4d76ed67fcbf9135" - integrity sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ== - -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== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -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: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.6: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -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== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" - integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== - dependencies: - "@sindresorhus/is" "^4.6.0" - char-regex "^1.0.2" - emojilib "^2.4.0" - skin-tone "^2.0.0" - -node-fetch-h2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" - integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== - dependencies: - http2-client "^1.2.5" - -node-fetch@^2.6.1, node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-readfiles@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" - integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== - dependencies: - es6-promise "^3.2.1" - -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -non-layered-tidy-tree-layout@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" - integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== - -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-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -normalize-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" - integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== - -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" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -oas-kit-common@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" - integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== - dependencies: - fast-safe-stringify "^2.0.7" - -oas-linter@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" - integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== - dependencies: - "@exodus/schemasafe" "^1.0.0-rc.2" - should "^13.2.1" - yaml "^1.10.0" - -oas-resolver@^2.5.6: - version "2.5.6" - resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" - integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== - dependencies: - node-fetch-h2 "^2.3.0" - oas-kit-common "^1.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -oas-schema-walker@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" - integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== - -oas-validator@^5.0.8: - version "5.0.8" - resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" - integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== - dependencies: - call-me-maybe "^1.0.1" - oas-kit-common "^1.0.8" - oas-linter "^3.2.2" - oas-resolver "^2.5.6" - oas-schema-walker "^1.1.5" - reftools "^1.1.9" - should "^13.2.1" - yaml "^1.10.0" - -object-assign@^4.1.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-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - 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" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -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: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -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" - -open@^8.0.9, 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" - -openapi-sampler@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.3.1.tgz#eebb2a1048f830cc277398bc8022b415f887e859" - integrity sha512-Ert9mvc2tLPmmInwSyGZS+v4Ogu9/YoZuq9oP3EdUklg2cad6+IGndP9yqJJwbgdXwZibiq5fpv6vYujchdJFg== - dependencies: - "@types/json-schema" "^7.0.7" - json-pointer "0.6.2" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - -p-limit@^2.0.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: - 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-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.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@^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-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -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-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -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== - -package-json@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" - integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== - dependencies: - got "^12.1.0" - registry-auth-token "^5.0.1" - registry-url "^6.0.0" - semver "^7.3.7" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -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@^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@^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.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== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - 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.2, 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== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -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-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-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-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-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -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== - -perfect-scrollbar@^1.5.5: - version "1.5.5" - resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" - integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== - -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" - -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== - -pkg-dir@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" - integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== - dependencies: - find-up "^6.3.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.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== - -polished@^4.1.3: - version "4.2.2" - resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" - integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== - dependencies: - "@babel/runtime" "^7.17.8" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-loader@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" - integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== - dependencies: - cosmiconfig "^8.2.0" - jiti "^1.18.2" - semver "^7.3.8" - -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sort-media-queries@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" - integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== - dependencies: - sort-css-media-queries "2.1.0" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== - -postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.26, postcss@^8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-time@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" - integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== - -prism-react-renderer@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.3.0.tgz#5f8f615af6af8201a0b734bd8c946df3d818ea54" - integrity sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg== - dependencies: - "@types/prismjs" "^1.26.0" - clsx "^2.0.0" - -prismjs@^1.27.0, prismjs@^1.29.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== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: - 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@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" - integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -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== - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pupa@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" - integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== - dependencies: - escape-goat "^4.0.0" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -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" - -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== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@^1.2.1, 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== - -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" - -rc@1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-base16-styling@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-helmet-async@*: - version "2.0.1" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.1.tgz#c97e53d03bfe578011e4abbd61113321b0362471" - integrity sha512-SFvEqfhFpLr5xqU6fWFb8wjVPjOR4A5skkNVNN5gAr/QeHutfDe4m1Cdo521umTiFRAY8hDOcl4xJO8sXN1n2Q== - dependencies: - invariant "^2.2.4" - react-fast-compare "^3.2.2" - shallowequal "^1.1.0" - -react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-is@^16.13.1, react-is@^16.6.0, 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-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-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== - dependencies: - "@babel/runtime" "^7.10.3" - -react-router-config@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" - integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== - dependencies: - "@babel/runtime" "^7.1.2" - -react-router-dom@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-tabs@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-4.3.0.tgz#9f4db0fd209ba4ab2c1e78993ff964435f84af62" - integrity sha512-2GfoG+f41kiBIIyd3gF+/GRCCYtamC8/2zlAcD8cqQmqI9Q+YVz7fJLHMmU9pXDVYYHpJeCgUSBJju85vu5q8Q== - dependencies: - clsx "^1.1.0" - prop-types "^15.5.0" - -react-textarea-autosize@~8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524" - integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -readable-stream@^2.0.1, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -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.5.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== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redoc@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.1.3.tgz#612c9fed744993d5fc99cbf39fe9056bd1034fa5" - integrity sha512-d7F9qLLxaiFW4GC03VkwlX9wuRIpx9aiIIf3o6mzMnqPfhxrn2IRKGndrkJeVdItgCfmg9jXZiFEowm60f1meQ== - dependencies: - "@redocly/openapi-core" "^1.0.0-rc.2" - classnames "^2.3.1" - decko "^1.2.0" - dompurify "^2.2.8" - eventemitter3 "^4.0.7" - json-pointer "^0.6.2" - lunr "^2.3.9" - mark.js "^8.11.1" - marked "^4.0.15" - mobx-react "^7.2.0" - openapi-sampler "^1.3.1" - path-browserify "^1.0.1" - perfect-scrollbar "^1.5.5" - polished "^4.1.3" - prismjs "^1.27.0" - prop-types "^15.7.2" - react-tabs "^4.3.0" - slugify "~1.4.7" - stickyfill "^1.1.1" - swagger2openapi "^7.0.6" - url-template "^2.0.8" - -redocusaurus@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redocusaurus/-/redocusaurus-2.0.0.tgz#83481ff4f5c6f2a00df901e359850bef3a7c43c6" - integrity sha512-wRSpkY+PwkqAj98RD+1ec6U8KDKySH6GT0jahWY+dPlpckyHj7D5i3ipXdTiJ6jXXCyM2qUwimX5PZJEdooDhA== - dependencies: - docusaurus-plugin-redoc "2.0.0" - docusaurus-theme-redoc "2.0.0" - -reftools@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" - integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== - -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -registry-auth-token@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" - integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== - dependencies: - "@pnpm/npm-conf" "^2.1.0" - -registry-url@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" - integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== - dependencies: - rc "1.2.8" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -rehype-raw@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" - integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== - dependencies: - "@types/hast" "^3.0.0" - hast-util-raw "^9.0.0" - vfile "^6.0.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-directive@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" - integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-directive "^3.0.0" - micromark-extension-directive "^3.0.0" - unified "^11.0.0" - -remark-emoji@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" - integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== - dependencies: - "@types/mdast" "^4.0.2" - emoticon "^4.0.1" - mdast-util-find-and-replace "^3.0.1" - node-emoji "^2.1.0" - unified "^11.0.4" - -remark-frontmatter@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" - integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-frontmatter "^2.0.0" - micromark-extension-frontmatter "^2.0.0" - unified "^11.0.0" - -remark-gfm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" - integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-gfm "^3.0.0" - micromark-extension-gfm "^3.0.0" - remark-parse "^11.0.0" - remark-stringify "^11.0.0" - unified "^11.0.0" - -remark-mdx@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.0.tgz#146905a3925b078970e05fc89b0e16b9cc3bfddd" - integrity sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g== - dependencies: - mdast-util-mdx "^3.0.0" - micromark-extension-mdxjs "^3.0.0" - -remark-parse@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" - integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-from-markdown "^2.0.0" - micromark-util-types "^2.0.0" - unified "^11.0.0" - -remark-rehype@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" - integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - mdast-util-to-hast "^13.0.0" - unified "^11.0.0" - vfile "^6.0.0" - -remark-stringify@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" - integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== - dependencies: - "@types/mdast" "^4.0.0" - mdast-util-to-markdown "^2.0.0" - unified "^11.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -"require-like@>= 0.1.1": - version "0.1.2" - resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" - integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -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-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve@^1.1.6, resolve@^1.14.2: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" - integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== - dependencies: - lowercase-keys "^3.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -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== - -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" - -robust-predicates@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" - integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== - -rtl-detect@^1.0.4: - version "1.1.2" - resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" - integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== - -rtlcss@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.1.1.tgz#f20409fcc197e47d1925996372be196fee900c0c" - integrity sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - postcss "^8.4.21" - strip-json-comments "^3.1.1" - -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" - -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -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, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - 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.1.0, safe-buffer@^5.1.0, 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== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.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" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -semver-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" - integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== - dependencies: - semver "^7.3.5" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -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-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-handler@^6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -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-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== - dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3, shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -should-equal@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" - integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== - dependencies: - should-type "^1.4.0" - -should-format@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" - integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== - dependencies: - should-type "^1.3.0" - should-type-adaptors "^1.0.1" - -should-type-adaptors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" - integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== - dependencies: - should-type "^1.3.0" - should-util "^1.0.0" - -should-type@^1.3.0, should-type@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" - integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== - -should-util@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" - integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== - -should@^13.2.1: - version "13.2.3" - resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" - integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== - dependencies: - should-equal "^2.0.0" - should-format "^3.0.3" - should-type "^1.4.0" - should-type-adaptors "^1.0.1" - should-util "^1.0.0" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - 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== - -sirv@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" - integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^3.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== - -sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== - dependencies: - "@types/node" "^17.0.5" - "@types/sax" "^1.2.1" - arg "^5.0.0" - sax "^1.2.4" - -skin-tone@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" - integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== - dependencies: - unicode-emoji-modifier-base "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slugify@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz#e42359d505afd84a44513280868e31202a79a628" - integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: - 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== - -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== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -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== - -srcset@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" - integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -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== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -std-env@^3.0.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.5.0.tgz#83010c9e29bd99bf6f605df87c19012d82d63b97" - integrity sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA== - -stickyfill@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" - integrity sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA== - -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.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_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" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.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" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.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.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-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-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-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-to-object@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" - integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== - dependencies: - inline-style-parser "0.1.1" - -styled-components@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.1.tgz#a5414ada07fb1c17b96a26a05369daa4e2ad55e5" - integrity sha512-cpZZP5RrKRIClBW5Eby4JM1wElLVP4NQrJbJ0h10TidTyJf4SIIwa3zLXOoPb4gJi8MsJ8mjq5mu2IrEhZIAcQ== - dependencies: - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/unitless" "^0.8.0" - "@types/stylis" "^4.0.2" - css-to-react-native "^3.2.0" - csstype "^3.1.2" - postcss "^8.4.31" - shallowequal "^1.1.0" - stylis "^4.3.0" - tslib "^2.5.0" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -stylis@^4.1.3, stylis@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -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== - -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -swagger2openapi@^7.0.6: - version "7.0.8" - resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" - integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== - dependencies: - call-me-maybe "^1.0.1" - node-fetch "^2.6.1" - node-fetch-h2 "^2.3.0" - node-readfiles "^0.2.0" - oas-kit-common "^1.0.8" - oas-resolver "^2.5.6" - oas-schema-walker "^1.1.5" - oas-validator "^5.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.7, terser-webpack-plugin@^5.3.9: - version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.10.0, terser@^5.15.1, terser@^5.16.8: - version "5.24.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" - integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -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== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -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== - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -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== - -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-dedent@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" - integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-fest@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.13.0, type-fest@^2.5.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -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" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -ua-parser-js@^1.0.35: - version "1.0.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" - integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-emoji-modifier-base@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" - integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: - version "11.0.4" - resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" - integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== - dependencies: - "@types/unist" "^3.0.0" - bail "^2.0.0" - devlop "^1.0.0" - extend "^3.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^6.0.0" - -unique-string@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" - integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== - dependencies: - crypto-random-string "^4.0.0" - -unist-util-is@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" - integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-position-from-estree@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" - integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-position@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" - integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-remove-position@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" - integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== - dependencies: - "@types/unist" "^3.0.0" - unist-util-visit "^5.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-stringify-position@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" - integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-visit-parents@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" - integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - -unist-util-visit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" - integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -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== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-notifier@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" - integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== - dependencies: - boxen "^7.0.0" - chalk "^5.0.1" - configstore "^6.0.0" - has-yarn "^3.0.0" - import-lazy "^4.0.0" - is-ci "^3.0.1" - is-installed-globally "^0.4.0" - is-npm "^6.0.0" - is-yarn-global "^0.4.0" - latest-version "^7.0.0" - pupa "^3.1.0" - semver "^7.3.7" - semver-diff "^4.0.0" - xdg-basedir "^5.1.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - 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-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, 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== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -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@^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.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -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" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -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== - -vfile-location@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" - integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== - dependencies: - "@types/unist" "^3.0.0" - vfile "^6.0.0" - -vfile-message@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" - integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - -vfile@^6.0.0, vfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" - integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - vfile-message "^4.0.0" - -wait-on@^7.0.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.2.0.tgz#d76b20ed3fc1e2bebc051fae5c1ff93be7892928" - integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ== - dependencies: - axios "^1.6.1" - joi "^17.11.0" - lodash "^4.17.21" - minimist "^1.2.8" - rxjs "^7.8.1" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - -web-worker@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" - integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== - -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== - -webpack-bundle-analyzer@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" - integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - commander "^7.2.0" - debounce "^1.2.1" - escape-string-regexp "^4.0.0" - gzip-size "^6.0.0" - html-escaper "^2.0.2" - is-plain-object "^5.0.0" - opener "^1.5.2" - picocolors "^1.0.0" - sirv "^2.0.3" - ws "^7.3.1" - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.15.1: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^5.9.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.88.1: - version "5.89.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" - integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== - dependencies: - chalk "^4.1.0" - consola "^2.15.3" - pretty-time "^1.1.0" - std-env "^3.0.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.3.1: - 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" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.13.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== - -xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" - integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== - -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@~4.0.1: - 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@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-ast-parser@0.0.43: - version "0.0.43" - resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" - integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -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@^16.1.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.1: - 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" - -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== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - -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== diff --git a/examples/client-mithril-stake-distribution/Cargo.toml b/examples/client-mithril-stake-distribution/Cargo.toml index 8f485080ca3..73373f98ac1 100644 --- a/examples/client-mithril-stake-distribution/Cargo.toml +++ b/examples/client-mithril-stake-distribution/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "client-mithril-stake-distribution" description = "Mithril client stake distribution example" -version = "0.1.0" -authors = ["dev@iohk.io"] +version = "0.1.6" +authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" homepage = "https://mithril.network" @@ -10,9 +10,9 @@ license = "Apache-2.0" repository = "https://github.com/input-output-hk/mithril/" [dependencies] -anyhow = "1.0.75" +anyhow = "1.0.79" mithril-client = { path = "../../mithril-client" } slog = "2.7.0" slog-async = "2.8.0" slog-term = "2.9.0" -tokio = { version = "1.32.0", features = ["full"] } +tokio = { version = "1.35.1", features = ["full"] } diff --git a/examples/client-mithril-stake-distribution/src/main.rs b/examples/client-mithril-stake-distribution/src/main.rs index 77f6ac2ba67..1be177a8ad8 100644 --- a/examples/client-mithril-stake-distribution/src/main.rs +++ b/examples/client-mithril-stake-distribution/src/main.rs @@ -5,7 +5,6 @@ //! The [SlogFeedbackReceiver] is used to report the progress to the console. use anyhow::anyhow; -use mithril_client::feedback::SlogFeedbackReceiver; use mithril_client::{ClientBuilder, MessageBuilder, MithrilResult}; use slog::info; use std::sync::Arc; @@ -16,7 +15,7 @@ async fn main() -> MithrilResult<()> { let genesis_verification_key = "5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d"; let logger = build_logger(); let client = ClientBuilder::aggregator(aggregator_endpoint, genesis_verification_key) - .add_feedback_receiver(Arc::new(SlogFeedbackReceiver::new(logger.clone()))) + .with_logger(logger.clone()) .build()?; let mithril_stake_distributions = client.mithril_stake_distribution().list().await?; diff --git a/examples/client-snapshot/Cargo.toml b/examples/client-snapshot/Cargo.toml index bb4a558c0a7..4d1587ea309 100644 --- a/examples/client-snapshot/Cargo.toml +++ b/examples/client-snapshot/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "client-snapshot" description = "Mithril client snapshot example" -version = "0.1.0" -authors = ["dev@iohk.io"] +version = "0.1.6" +authors = ["dev@iohk.io", "mithril-dev@iohk.io"] documentation = "https://mithril.network/doc" edition = "2021" homepage = "https://mithril.network" @@ -10,9 +10,9 @@ license = "Apache-2.0" repository = "https://github.com/input-output-hk/mithril/" [dependencies] -anyhow = "1.0.75" -async-trait = "0.1.73" -futures = "0.3.28" +anyhow = "1.0.79" +async-trait = "0.1.77" +futures = "0.3.30" indicatif = "0.17.7" mithril-client = { path = "../../mithril-client", features = ["fs"] } -tokio = { version = "1.32.0", features = ["full"] } +tokio = { version = "1.35.1", features = ["full"] } diff --git a/examples/client-snapshot/README.md b/examples/client-snapshot/README.md index dc585e7ebe4..17d72616c28 100644 --- a/examples/client-snapshot/README.md +++ b/examples/client-snapshot/README.md @@ -11,6 +11,7 @@ In this example, the client interacts with a real aggregator on the network `tes - verify a certificate chain - compute a message for a Snapshot - verify that the certificate signs the computed message +- increments snapshot download statistics The crate [indicatif](https://docs.rs/indicatif/latest/indicatif/) is used to nicely report the progress to the console. diff --git a/examples/client-snapshot/src/main.rs b/examples/client-snapshot/src/main.rs index 64a60a4aa92..49ff194acba 100644 --- a/examples/client-snapshot/src/main.rs +++ b/examples/client-snapshot/src/main.rs @@ -55,6 +55,10 @@ async fn main() -> MithrilResult<()> { .download_unpack(&snapshot, &unpacked_dir) .await?; + if let Err(e) = client.snapshot().add_statistics(&snapshot).await { + println!("Could not increment snapshot download statistics: {:?}", e); + } + println!("Computing snapshot '{}' message ...", snapshot.digest); let message = wait_spinner( &progress_bar, diff --git a/flake.lock b/flake.lock index 63decfbaed0..1ce9bcd0d95 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1701220101, - "narHash": "sha256-EBuCZ/Vjp3ovx8ZvfALfuUk4/76Ey/6cJmzmeXBRmDk=", + "lastModified": 1707461758, + "narHash": "sha256-VaqINICYEtVKF0X+chdNtXcNp6poZr385v6AG7j0ybM=", "owner": "ipetkov", "repo": "crane", - "rev": "514cd663e5af505a244e55ad013733638574aff9", + "rev": "505976eaeac289fe41d074bee37006ac094636bb", "type": "github" }, "original": { @@ -25,11 +25,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1698882062, - "narHash": "sha256-HkhafUayIqxXyHH1X8d9RDl1M2CkFgZLjKD3MzabiEo=", + "lastModified": 1706830856, + "narHash": "sha256-a0NYyp+h9hlb7ddVz4LUn1vT/PLwqfrWYcHMvFB1xYg=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "8c9fa2545007b49a5db5f650ae91f227672c3877", + "rev": "b253292d9c0a5ead9bc98c4e9a26c6312e27d69f", "type": "github" }, "original": { @@ -40,11 +40,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1701174899, - "narHash": "sha256-1W+FMe8mWsJKXoBc+QgKmEeRj33kTFnPq7XCjU+bfnA=", + "lastModified": 1707451808, + "narHash": "sha256-UwDBUNHNRsYKFJzyTMVMTF5qS4xeJlWoeyJf+6vvamU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "010c7296f3b19a58b206fdf7d68d75a5b0a09e9e", + "rev": "442d407992384ed9c0e6d352de75b69079904e4e", "type": "github" }, "original": { @@ -57,11 +57,11 @@ "nixpkgs-lib": { "locked": { "dir": "lib", - "lastModified": 1698611440, - "narHash": "sha256-jPjHjrerhYDy3q9+s5EAsuhyhuknNfowY6yt6pjn9pc=", + "lastModified": 1706550542, + "narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0cbe9f69c234a7700596e943bfae7ef27a31b735", + "rev": "97b17f32362e475016f942bbdfda4a4a72a8a652", "type": "github" }, "original": { @@ -87,11 +87,11 @@ ] }, "locked": { - "lastModified": 1699786194, - "narHash": "sha256-3h3EH1FXQkIeAuzaWB+nK0XK54uSD46pp+dMD3gAcB4=", + "lastModified": 1707300477, + "narHash": "sha256-qQF0fEkHlnxHcrKIMRzOETnRBksUK048MXkX0SOmxvA=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "e82f32aa7f06bbbd56d7b12186d555223dc399d1", + "rev": "ac599dab59a66304eb511af07b3883114f061b9d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a9e720496e3..fdb05cdc06b 100644 --- a/flake.nix +++ b/flake.nix @@ -37,8 +37,9 @@ isCargoFile = base == "Cargo.lock"; isCargoConfig = parentDir == ".cargo" && base == "config"; isOpenApiYaml = base == "openapi.yaml"; + isTestDataAsset = lib.hasInfix "/test_data/" path; in - type == "directory" || matchesSuffix || isCargoFile || isCargoConfig || isOpenApiYaml; + type == "directory" || matchesSuffix || isCargoFile || isCargoConfig || isOpenApiYaml || isTestDataAsset; }; buildInputs = @@ -107,6 +108,7 @@ mithril-client-cli = buildPackage ./mithril-client-cli/Cargo.toml mithril.cargoArtifacts {}; mithril-aggregator = buildPackage ./mithril-aggregator/Cargo.toml mithril.cargoArtifacts {}; mithril-signer = buildPackage ./mithril-signer/Cargo.toml mithril.cargoArtifacts {}; + mithril-persistence = buildPackage ./mithril-persistence/Cargo.toml mithril.cargoArtifacts {}; mithrildemo = buildPackage ./demo/protocol-demo/Cargo.toml mithril.cargoArtifacts {}; mithril-end-to-end = buildPackage ./mithril-test-lab/mithril-end-to-end/Cargo.toml null {}; }; diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 2d8df34fd3e..456344358a8 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.4.19" +version = "0.4.36" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } @@ -10,49 +10,50 @@ license = { workspace = true } repository = { workspace = true } [dependencies] -anyhow = "1.0.75" -async-trait = "0.1.73" -chrono = { version = "0.4.31", features = ["serde"] } -clap = { version = "4.4.6", features = ["derive", "env", "cargo"] } +anyhow = "1.0.79" +async-trait = "0.1.77" +chrono = { version = "0.4.33", features = ["serde"] } +clap = { version = "4.4.18", features = ["derive", "env", "cargo"] } cloud-storage = "0.11.1" -config = "0.13.3" -flate2 = "1.0.27" +config = "0.13.4" +flate2 = "1.0.28" hex = "0.4.3" mithril-common = { path = "../mithril-common", features = ["full"] } -openssl = { version = "0.10.57", features = ["vendored"], optional = true } +mithril-persistence = { path = "../mithril-persistence" } +openssl = { version = "0.10.63", features = ["vendored"], optional = true } openssl-probe = { version = "0.1.5", optional = true } -reqwest = { version = "0.11.22", features = ["json"] } -semver = "1.0.19" -serde = { version = "1.0.188", features = ["derive"] } -serde_json = "1.0.107" -serde_yaml = "0.9.25" +reqwest = { version = "0.11.23", features = ["json"] } +semver = "1.0.21" +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.113" +serde_yaml = "0.9.31" sha2 = "0.10.8" slog = { version = "2.7.0", features = [ "max_level_trace", "release_max_level_debug", ] } slog-async = "2.8.0" -slog-bunyan = "2.4.0" +slog-bunyan = "2.5.0" slog-scope = "4.4.0" -sqlite = { version = "0.32.0", features = ["bundled"] } +sqlite = { version = "0.33.0", features = ["bundled"] } tar = "0.4.40" -thiserror = "1.0.49" -tokio = { version = "1.32.0", features = ["full"] } -tokio-util = { version = "0.7.9", features = ["codec"] } -typetag = "0.2.13" -uuid = { version = "1.4.1", features = ["v4", "fast-rng", "macro-diagnostics"] } +thiserror = "1.0.56" +tokio = { version = "1.35.1", features = ["full"] } +tokio-util = { version = "0.7.10", features = ["codec"] } +typetag = "0.2.15" +uuid = { version = "1.7.0", features = ["v4", "fast-rng", "macro-diagnostics"] } warp = "0.3.6" zstd = { version = "0.13.0", features = ["zstdmt"] } [dev-dependencies] -httpmock = "0.6.8" +httpmock = "0.7.0" mithril-common = { path = "../mithril-common", features = [ "allow_skip_signer_certification", "test_tools", ] } -mockall = "0.11.4" +mockall = "0.12.1" slog-term = "2.9.0" -tempfile = "3.8.0" +tempfile = "3.9.0" [features] portable = [ diff --git a/mithril-aggregator/Dockerfile b/mithril-aggregator/Dockerfile index 5101c270676..e71c298da44 100644 --- a/mithril-aggregator/Dockerfile +++ b/mithril-aggregator/Dockerfile @@ -32,7 +32,8 @@ RUN /app/target/release/mithril-aggregator --version FROM debian:11-slim # Args -ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/8.1.2/cardano-node-8.1.2-linux.tar.gz +ARG CARDANO_NODE_VERSION=8.7.3 +ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/$CARDANO_NODE_VERSION/cardano-node-$CARDANO_NODE_VERSION-linux.tar.gz # Upgrade RUN apt-get update -y && apt-get install -y libssl-dev ca-certificates wget sqlite3 && rm -rf /var/lib/apt/lists/* diff --git a/mithril-aggregator/Dockerfile.ci b/mithril-aggregator/Dockerfile.ci index a0da9289a85..448731433c0 100644 --- a/mithril-aggregator/Dockerfile.ci +++ b/mithril-aggregator/Dockerfile.ci @@ -14,7 +14,8 @@ RUN mkdir -p /app/bin RUN apt-get update -y && apt-get install -y libssl-dev ca-certificates wget && apt-get clean && rm -rf /var/lib/apt/lists/* # Install cardano-cli -ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/8.1.2/cardano-node-8.1.2-linux.tar.gz +ARG CARDANO_NODE_VERSION=8.7.3 +ARG CARDANO_BIN_URL=https://github.com/input-output-hk/cardano-node/releases/download/$CARDANO_NODE_VERSION/cardano-node-$CARDANO_NODE_VERSION-linux.tar.gz RUN wget -nv -O cardano-bin.tar.gz $CARDANO_BIN_URL \ && tar xzf cardano-bin.tar.gz ./cardano-cli && mv cardano-cli /app/bin \ && /app/bin/cardano-cli --version \ diff --git a/mithril-aggregator/Makefile b/mithril-aggregator/Makefile index 127618a74ef..04da532b335 100644 --- a/mithril-aggregator/Makefile +++ b/mithril-aggregator/Makefile @@ -33,7 +33,7 @@ docker-build: cd ../ && docker build -t mithril/mithril-aggregator -f mithril-aggregator/Dockerfile . docker-build-ci: build - cd ../ && docker build -t mithril/mithril-aggregator -f mithril-aggregator/Dockerfile.ci --build-arg DOCKER_IMAGE_FROM . + cd ../ && docker build -t mithril/mithril-aggregator -f mithril-aggregator/Dockerfile.ci --build-arg DOCKER_IMAGE_FROM --build-arg CARDANO_NODE_VERSION . docker-run: docker run --rm -p 8080:8080 --name='mithril-aggregator' mithril/mithril-aggregator serve diff --git a/mithril-aggregator/src/artifact_builder/cardano_transactions.rs b/mithril-aggregator/src/artifact_builder/cardano_transactions.rs new file mode 100644 index 00000000000..19c265bd43b --- /dev/null +++ b/mithril-aggregator/src/artifact_builder/cardano_transactions.rs @@ -0,0 +1,97 @@ +use async_trait::async_trait; + +use super::ArtifactBuilder; +use anyhow::{anyhow, Context}; +use mithril_common::{ + entities::{ + Beacon, CardanoTransactionsCommitment, Certificate, ProtocolMessagePartKey, + SignedEntityType, + }, + StdResult, +}; + +/// A [CardanoTransactionsArtifact] builder +pub struct CardanoTransactionsArtifactBuilder {} + +impl CardanoTransactionsArtifactBuilder { + /// CardanoTransactions artifact builder factory + pub fn new() -> Self { + Self {} + } +} + +#[async_trait] +impl ArtifactBuilder for CardanoTransactionsArtifactBuilder { + async fn compute_artifact( + &self, + beacon: Beacon, + certificate: &Certificate, + ) -> StdResult { + let merkle_root = certificate + .protocol_message + .get_message_part(&ProtocolMessagePartKey::CardanoTransactionsMerkleRoot) + .ok_or(anyhow!( + "Can not find CardanoTransactionsMerkleRoot protocol message part in certificate" + )) + .with_context(|| { + format!( + "Can not compute CardanoTransactionsCommitment artifact for signed_entity: {:?}", + SignedEntityType::CardanoTransactions(beacon.clone()) + ) + })?; + + Ok(CardanoTransactionsCommitment::new( + merkle_root.to_string(), + beacon, + )) + } +} + +#[cfg(test)] +mod tests { + use mithril_common::{ + entities::ProtocolMessage, + test_utils::fake_data::{self}, + }; + + use super::*; + + #[tokio::test] + async fn should_compute_valid_artifact_with_merkleroot() { + let certificate = { + let mut certificate = fake_data::certificate("certificate-123".to_string()); + let mut message = ProtocolMessage::new(); + message.set_message_part( + ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, + "merkleroot".to_string(), + ); + certificate.protocol_message = message; + certificate + }; + + let cardano_transaction_artifact_builder = CardanoTransactionsArtifactBuilder::new(); + let artifact = cardano_transaction_artifact_builder + .compute_artifact(certificate.beacon.clone(), &certificate) + .await + .unwrap(); + let artifact_expected = + CardanoTransactionsCommitment::new("merkleroot".to_string(), certificate.beacon); + assert_eq!(artifact_expected, artifact); + } + + #[tokio::test] + async fn should_fail_to_compute_artifact_without_merkle_root() { + let certificate = { + let mut certificate = fake_data::certificate("certificate-123".to_string()); + let message = ProtocolMessage::new(); + certificate.protocol_message = message; + certificate + }; + + let cardano_transaction_artifact_builder = CardanoTransactionsArtifactBuilder::new(); + cardano_transaction_artifact_builder + .compute_artifact(Beacon::default(), &certificate) + .await + .expect_err("The artifact building must fail since there is no CardanoTransactionsMerkleRoot part in its message."); + } +} diff --git a/mithril-aggregator/src/artifact_builder/mod.rs b/mithril-aggregator/src/artifact_builder/mod.rs index 53d3e8f796a..3727c5d1031 100644 --- a/mithril-aggregator/src/artifact_builder/mod.rs +++ b/mithril-aggregator/src/artifact_builder/mod.rs @@ -1,8 +1,10 @@ //! The module used for building artifact mod cardano_immutable_files_full; +mod cardano_transactions; mod interface; mod mithril_stake_distribution; pub use cardano_immutable_files_full::*; +pub use cardano_transactions::*; pub use interface::*; pub use mithril_stake_distribution::*; diff --git a/mithril-aggregator/src/commands/era_command.rs b/mithril-aggregator/src/commands/era_command.rs index 060d60dda1c..fd9b2bae468 100644 --- a/mithril-aggregator/src/commands/era_command.rs +++ b/mithril-aggregator/src/commands/era_command.rs @@ -1,3 +1,5 @@ +use std::{fs::File, io::Write, path::PathBuf}; + use anyhow::Context; use clap::{Parser, Subcommand}; use config::{builder::DefaultState, ConfigBuilder}; @@ -82,6 +84,10 @@ pub struct GenerateTxDatumEraSubCommand { /// Era Markers Secret Key #[clap(long, env = "ERA_MARKERS_SECRET_KEY")] era_markers_secret_key: HexEncodedEraMarkersSecretKey, + + /// Target Path + #[clap(long)] + target_path: PathBuf, } impl GenerateTxDatumEraSubCommand { @@ -93,14 +99,14 @@ impl GenerateTxDatumEraSubCommand { EraMarkersVerifierSecretKey::from_json_hex(&self.era_markers_secret_key) .with_context(|| "json hex decode of era markers secret key failure")?; let era_markers_signer = EraMarkersSigner::from_secret_key(era_markers_secret_key); - print!( - "{}", - era_tools.generate_tx_datum( - Epoch(self.current_era_epoch), - self.next_era_epoch.map(Epoch), - &era_markers_signer - )? - ); + let tx_datum = era_tools.generate_tx_datum( + Epoch(self.current_era_epoch), + self.next_era_epoch.map(Epoch), + &era_markers_signer, + )?; + + let mut target_file = File::create(&self.target_path)?; + target_file.write_all(tx_datum.as_bytes())?; Ok(()) } diff --git a/mithril-aggregator/src/commands/tools_command.rs b/mithril-aggregator/src/commands/tools_command.rs index e65845c0d52..12f8f00c4a8 100644 --- a/mithril-aggregator/src/commands/tools_command.rs +++ b/mithril-aggregator/src/commands/tools_command.rs @@ -1,8 +1,8 @@ use anyhow::Context; use clap::{Parser, Subcommand}; use config::{builder::DefaultState, ConfigBuilder}; -use mithril_common::sqlite::vacuum_database; use mithril_common::StdResult; +use mithril_persistence::sqlite::vacuum_database; use slog_scope::debug; use std::sync::Arc; diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index e233079cc75..ccc0cb946ea 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -1,5 +1,6 @@ use anyhow::anyhow; use config::{ConfigError, Map, Source, Value, ValueKind}; +use mithril_common::chain_observer::ChainObserverType; use mithril_common::crypto_helper::ProtocolGenesisSigner; use mithril_common::era::adapters::EraReaderAdapterType; use serde::{Deserialize, Serialize}; @@ -64,6 +65,9 @@ pub struct Configuration { /// Cardano network pub network: String, + /// Cardano chain observer type + pub chain_observer_type: ChainObserverType, + /// Protocol parameters pub protocol_parameters: ProtocolParameters, @@ -115,6 +119,9 @@ pub struct Configuration { /// Era reader adapter parameters pub era_reader_adapter_params: Option, + /// Signed entity types parameters (discriminants names in an ordered comma separated list). + pub signed_entity_types: Option, + /// Compression algorithm used for the snapshot archive artifacts. pub snapshot_compression_algorithm: CompressionAlgorithm, @@ -172,6 +179,7 @@ impl Configuration { cardano_node_version: "0.0.1".to_string(), network_magic: Some(42), network: "devnet".to_string(), + chain_observer_type: ChainObserverType::Fake, protocol_parameters: ProtocolParameters { k: 5, m: 100, @@ -192,6 +200,7 @@ impl Configuration { store_retention_limit: None, era_reader_adapter_type: EraReaderAdapterType::Bootstrap, era_reader_adapter_params: None, + signed_entity_types: None, snapshot_compression_algorithm: CompressionAlgorithm::Zstandard, zstandard_parameters: Some(ZstandardCompressionParameters::default()), cexplorer_pools_url: None, @@ -259,6 +268,9 @@ pub struct DefaultConfiguration { /// Era reader adapter type pub era_reader_adapter_type: String, + /// Chain observer type + pub chain_observer_type: String, + /// ImmutableDigesterCacheProvider default setting pub reset_digests_cache: String, @@ -286,6 +298,7 @@ impl Default for DefaultConfiguration { snapshot_store_type: "local".to_string(), snapshot_uploader_type: "gcp".to_string(), era_reader_adapter_type: "bootstrap".to_string(), + chain_observer_type: "pallas".to_string(), reset_digests_cache: "false".to_string(), disable_digests_cache: "false".to_string(), snapshot_compression_algorithm: "zstandard".to_string(), diff --git a/mithril-aggregator/src/database/cardano_transaction_migration.rs b/mithril-aggregator/src/database/cardano_transaction_migration.rs new file mode 100644 index 00000000000..37e156ecad4 --- /dev/null +++ b/mithril-aggregator/src/database/cardano_transaction_migration.rs @@ -0,0 +1,26 @@ +//! Migration module for cardano transactions store +//! +use mithril_persistence::database::SqlMigration; + +/// Get all the migrations required by this version of the software. +/// There shall be one migration per database version. There could be several +/// statements per migration. +pub fn get_migrations() -> Vec { + vec![ + // Migration 1 + // Add the `cardano_tx` table. + SqlMigration::new( + 1, + r#" +create table cardano_tx ( + transaction_hash text not null, + block_number integer not null, + immutable_file_number integer not null, + primary key (transaction_hash) +); + +create unique index cardano_tx_immutable_file_number_index on cardano_tx(immutable_file_number); +"#, + ), + ] +} diff --git a/mithril-aggregator/src/database/migration.rs b/mithril-aggregator/src/database/migration.rs index 130c9f94e9d..c0d5e2398a9 100644 --- a/mithril-aggregator/src/database/migration.rs +++ b/mithril-aggregator/src/database/migration.rs @@ -1,6 +1,6 @@ //! Migration module //! -use mithril_common::database::SqlMigration; +use mithril_persistence::database::SqlMigration; /// Get all the migrations required by this version of the software. /// There shall be one migration per database version. There could be several @@ -601,5 +601,23 @@ alter table signer add column last_registered_at text null; update signer set last_registered_at = created_at; "#, ), + // Migration 20 + // Alter `open_message` table to add `expires_at` and 'is_expired' fields + SqlMigration::new( + 20, + r#" +alter table open_message add column is_expired bool not null default false; +alter table open_message add column expires_at text null; + "#, + ), + // Migration 21 + // Add the `signed_entity_type` record for 'CardanoTransactions' + SqlMigration::new( + 21, + r#" +insert into signed_entity_type (signed_entity_type_id, name) + values (3, 'Cardano Transactions'); +"#, + ), ] } diff --git a/mithril-aggregator/src/database/mod.rs b/mithril-aggregator/src/database/mod.rs index ef99498cf6a..82729bf9fd9 100644 --- a/mithril-aggregator/src/database/mod.rs +++ b/mithril-aggregator/src/database/mod.rs @@ -1,5 +1,7 @@ //! database module. //! This module contains the entities definition tied with database //! representation with their associated providers. + +pub mod cardano_transaction_migration; pub mod migration; pub mod provider; diff --git a/mithril-aggregator/src/database/provider/cardano_transaction.rs b/mithril-aggregator/src/database/provider/cardano_transaction.rs new file mode 100644 index 00000000000..705bc45aa4d --- /dev/null +++ b/mithril-aggregator/src/database/provider/cardano_transaction.rs @@ -0,0 +1,647 @@ +use mithril_common::{ + entities::{Beacon, BlockNumber, CardanoTransaction, ImmutableFileNumber, TransactionHash}, + signable_builder::TransactionStore, + StdResult, +}; +use mithril_persistence::sqlite::{ + HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, SqliteConnection, + WhereCondition, +}; + +use anyhow::Context; +use async_trait::async_trait; +use sqlite::{Row, Value}; +use std::{iter::repeat, sync::Arc}; + +use crate::services::TransactionsRetriever; + +/// Cardano Transaction record is the representation of a cardano transaction. +#[derive(Debug, PartialEq, Clone)] +pub struct CardanoTransactionRecord { + /// Unique hash of the transaction + pub transaction_hash: TransactionHash, + + /// Block number of the transaction + pub block_number: BlockNumber, + + /// Immutable file number of the transaction + pub immutable_file_number: ImmutableFileNumber, +} + +impl From for CardanoTransactionRecord { + fn from(transaction: CardanoTransaction) -> Self { + Self { + transaction_hash: transaction.transaction_hash, + block_number: transaction.block_number, + immutable_file_number: transaction.immutable_file_number, + } + } +} + +impl From for CardanoTransaction { + fn from(other: CardanoTransactionRecord) -> CardanoTransaction { + CardanoTransaction { + transaction_hash: other.transaction_hash, + block_number: other.block_number, + immutable_file_number: other.immutable_file_number, + } + } +} + +impl SqLiteEntity for CardanoTransactionRecord { + fn hydrate(row: Row) -> Result + where + Self: Sized, + { + let transaction_hash = row.read::<&str, _>(0); + let block_number = row.read::(1); + let block_number = u64::try_from(block_number) + .map_err(|e| HydrationError::InvalidData(format!("Integer field cardano_tx.block_number (value={block_number}) is incompatible with u64 representation. Error = {e}")))?; + let immutable_file_number = row.read::(2); + let immutable_file_number = u64::try_from(immutable_file_number) + .map_err(|e| HydrationError::InvalidData(format!("Integer field cardano_tx.immutable_file_number (value={immutable_file_number}) is incompatible with u64 representation. Error = {e}")))?; + + Ok(Self { + transaction_hash: transaction_hash.to_string(), + block_number, + immutable_file_number, + }) + } + + fn get_projection() -> Projection { + Projection::from(&[ + ( + "transaction_hash", + "{:cardano_tx:}.transaction_hash", + "text", + ), + ("block_number", "{:cardano_tx:}.block_number", "int"), + ( + "immutable_file_number", + "{:cardano_tx:}.immutable_file_number", + "int", + ), + ]) + } +} + +struct CardanoTransactionProvider<'client> { + connection: &'client SqliteConnection, +} + +impl<'client> CardanoTransactionProvider<'client> { + pub fn new(connection: &'client SqliteConnection) -> Self { + Self { connection } + } + + // Useful in test and probably in the future. + #[allow(dead_code)] + fn get_transaction_hash_condition(&self, transaction_hash: &TransactionHash) -> WhereCondition { + WhereCondition::new( + "transaction_hash = ?*", + vec![Value::String(transaction_hash.to_owned())], + ) + } + + pub(crate) fn get_transaction_up_to_beacon_condition(&self, beacon: &Beacon) -> WhereCondition { + WhereCondition::new( + "immutable_file_number <= ?*", + vec![Value::Integer(beacon.immutable_file_number as i64)], + ) + } +} + +impl<'client> Provider<'client> for CardanoTransactionProvider<'client> { + type Entity = CardanoTransactionRecord; + + fn get_connection(&'client self) -> &'client SqliteConnection { + self.connection + } + + fn get_definition(&self, condition: &str) -> String { + let aliases = SourceAlias::new(&[("{:cardano_tx:}", "cardano_tx")]); + let projection = Self::Entity::get_projection().expand(aliases); + + format!( + "select {projection} from cardano_tx where {condition} order by transaction_hash desc" + ) + } +} + +struct InsertCardanoTransactionProvider<'client> { + connection: &'client SqliteConnection, +} + +impl<'client> InsertCardanoTransactionProvider<'client> { + pub fn new(connection: &'client SqliteConnection) -> Self { + Self { connection } + } + + fn get_insert_condition(&self, record: &CardanoTransactionRecord) -> StdResult { + let expression = + "(transaction_hash, block_number, immutable_file_number) values (?1, ?2, ?3)"; + let parameters = vec![ + Value::String(record.transaction_hash.clone()), + Value::Integer(record.block_number.try_into()?), + Value::Integer(record.immutable_file_number.try_into()?), + ]; + + Ok(WhereCondition::new(expression, parameters)) + } + + fn get_insert_many_condition( + &self, + transactions_records: Vec, + ) -> WhereCondition { + let columns = "(transaction_hash, block_number, immutable_file_number)"; + let values_columns: Vec<&str> = repeat("(?*, ?*, ?*)") + .take(transactions_records.len()) + .collect(); + + let values: Vec = transactions_records + .into_iter() + .flat_map(|record| { + vec![ + Value::String(record.transaction_hash), + Value::Integer(record.block_number.try_into().unwrap()), + Value::Integer(record.immutable_file_number.try_into().unwrap()), + ] + }) + .collect(); + + WhereCondition::new( + format!("{columns} values {}", values_columns.join(", ")).as_str(), + values, + ) + } +} + +impl<'client> Provider<'client> for InsertCardanoTransactionProvider<'client> { + type Entity = CardanoTransactionRecord; + + fn get_connection(&'client self) -> &'client SqliteConnection { + self.connection + } + + fn get_definition(&self, condition: &str) -> String { + let aliases = SourceAlias::new(&[("{:cardano_tx:}", "cardano_tx")]); + let projection = Self::Entity::get_projection().expand(aliases); + + format!("insert or ignore into cardano_tx {condition} returning {projection}") + } +} + +/// ## Cardano transaction repository +/// +/// This is a business oriented layer to perform actions on the database through +/// providers. +pub struct CardanoTransactionRepository { + connection: Arc, +} + +impl CardanoTransactionRepository { + /// Instantiate service + pub fn new(connection: Arc) -> Self { + Self { connection } + } + + /// Return all the [CardanoTransactionRecord]s in the database. + pub async fn get_all_transactions(&self) -> StdResult> { + let provider = CardanoTransactionProvider::new(&self.connection); + let filters = WhereCondition::default(); + let transactions = provider.find(filters)?; + + Ok(transactions.collect()) + } + + /// Return all the [CardanoTransactionRecord]s in the database up to the given beacon. + pub async fn get_transactions_up_to( + &self, + beacon: &Beacon, + ) -> StdResult> { + let provider = CardanoTransactionProvider::new(&self.connection); + let filters = provider.get_transaction_up_to_beacon_condition(beacon); + let transactions = provider.find(filters)?; + + Ok(transactions.collect()) + } + + /// Return the [CardanoTransactionRecord] for the given transaction hash. + pub async fn get_transaction( + &self, + transaction_hash: &TransactionHash, + ) -> StdResult> { + let provider = CardanoTransactionProvider::new(&self.connection); + let filters = provider.get_transaction_hash_condition(transaction_hash); + let mut transactions = provider.find(filters)?; + + Ok(transactions.next()) + } + + /// Create a new [CardanoTransactionRecord] in the database. + pub async fn create_transaction( + &self, + transaction_hash: &TransactionHash, + block_number: BlockNumber, + immutable_file_number: ImmutableFileNumber, + ) -> StdResult> { + let provider = InsertCardanoTransactionProvider::new(&self.connection); + let filters = provider.get_insert_condition(&CardanoTransactionRecord { + transaction_hash: transaction_hash.to_owned(), + block_number, + immutable_file_number, + })?; + let mut cursor = provider.find(filters)?; + + Ok(cursor.next()) + } + + /// Create new [CardanoTransactionRecord]s in the database. + pub async fn create_transactions( + &self, + transactions: Vec, + ) -> StdResult> { + let provider = InsertCardanoTransactionProvider::new(&self.connection); + let filters = provider.get_insert_many_condition(transactions); + let cursor = provider.find(filters)?; + + Ok(cursor.collect()) + } +} + +#[async_trait] +impl TransactionStore for CardanoTransactionRepository { + async fn store_transactions(&self, transactions: &[CardanoTransaction]) -> StdResult<()> { + let records: Vec = + transactions.iter().map(|tx| tx.to_owned().into()).collect(); + self.create_transactions(records) + .await + .with_context(|| "CardanoTransactionRepository can not store transactions")?; + + Ok(()) + } +} + +#[async_trait] +impl TransactionsRetriever for CardanoTransactionRepository { + async fn get_up_to(&self, beacon: &Beacon) -> StdResult> { + self.get_transactions_up_to(beacon).await.map(|v| { + v.into_iter() + .map(|record| record.into()) + .collect::>() + }) + } +} + +#[cfg(test)] +mod tests { + use mithril_persistence::sqlite::SourceAlias; + use sqlite::Connection; + + use crate::{dependency_injection::DependenciesBuilder, Configuration}; + + use super::*; + + async fn get_connection() -> Arc { + let config = Configuration::new_sample(); + let mut builder = DependenciesBuilder::new(config); + builder + .get_sqlite_connection_cardano_transaction() + .await + .unwrap() + } + + #[test] + fn cardano_transaction_projection() { + let projection = CardanoTransactionRecord::get_projection(); + let aliases = SourceAlias::new(&[("{:cardano_tx:}", "cardano_tx")]); + + assert_eq!( + "cardano_tx.transaction_hash as transaction_hash, cardano_tx.block_number as block_number, cardano_tx.immutable_file_number as immutable_file_number".to_string(), + projection.expand(aliases) + ) + } + + #[test] + fn provider_transaction_hash_condition() { + let connection = Connection::open_thread_safe(":memory:").unwrap(); + let provider = CardanoTransactionProvider::new(&connection); + let (expr, params) = provider + .get_transaction_hash_condition( + &"0405a78c637f5c637e3146e293c0045ea80a07fac8f245901e7b491182931650".to_string(), + ) + .expand(); + + assert_eq!("transaction_hash = ?1".to_string(), expr); + assert_eq!( + vec![Value::String( + "0405a78c637f5c637e3146e293c0045ea80a07fac8f245901e7b491182931650".to_string() + )], + params, + ); + } + + #[test] + fn provider_transaction_up_to_beacon_condition() { + let connection = Connection::open_thread_safe(":memory:").unwrap(); + let provider = CardanoTransactionProvider::new(&connection); + let (expr, params) = provider + .get_transaction_up_to_beacon_condition(&Beacon { + immutable_file_number: 2309, + ..Beacon::default() + }) + .expand(); + + assert_eq!("immutable_file_number <= ?1".to_string(), expr); + assert_eq!(vec![Value::Integer(2309)], params,); + } + + #[test] + fn insert_provider_condition() { + let connection = Connection::open_thread_safe(":memory:").unwrap(); + let provider = InsertCardanoTransactionProvider::new(&connection); + let (expr, params) = provider + .get_insert_condition(&CardanoTransactionRecord { + transaction_hash: + "0405a78c637f5c637e3146e293c0045ea80a07fac8f245901e7b491182931650".to_string(), + block_number: 10, + immutable_file_number: 99, + }) + .unwrap() + .expand(); + + assert_eq!( + "(transaction_hash, block_number, immutable_file_number) values (?1, ?2, ?3)" + .to_string(), + expr + ); + assert_eq!( + vec![ + Value::String( + "0405a78c637f5c637e3146e293c0045ea80a07fac8f245901e7b491182931650".to_string() + ), + Value::Integer(10), + Value::Integer(99) + ], + params + ); + } + + #[test] + fn insert_provider_many_condition() { + let connection = Connection::open_thread_safe(":memory:").unwrap(); + let provider = InsertCardanoTransactionProvider::new(&connection); + let (expr, params) = provider + .get_insert_many_condition(vec![ + CardanoTransactionRecord { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99, + }, + CardanoTransactionRecord { + transaction_hash: "tx-hash-456".to_string(), + block_number: 11, + immutable_file_number: 100, + }, + ]) + .expand(); + + assert_eq!( + "(transaction_hash, block_number, immutable_file_number) values (?1, ?2, ?3), (?4, ?5, ?6)" + .to_string(), + expr + ); + assert_eq!( + vec![ + Value::String("tx-hash-123".to_string()), + Value::Integer(10), + Value::Integer(99), + Value::String("tx-hash-456".to_string()), + Value::Integer(11), + Value::Integer(100) + ], + params + ); + } + + #[tokio::test] + async fn repository_create_and_get_transaction() { + let connection = get_connection().await; + let repository = CardanoTransactionRepository::new(connection.clone()); + repository + .create_transaction(&"tx-hash-123".to_string(), 10, 99) + .await + .unwrap(); + repository + .create_transaction(&"tx-hash-456".to_string(), 11, 100) + .await + .unwrap(); + let transaction_result = repository + .get_transaction(&"tx-hash-123".to_string()) + .await + .unwrap(); + + assert_eq!( + Some(CardanoTransactionRecord { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99 + }), + transaction_result + ); + } + + #[tokio::test] + async fn repository_create_ignore_further_transactions_when_exists() { + let connection = get_connection().await; + let repository = CardanoTransactionRepository::new(connection.clone()); + repository + .create_transaction(&"tx-hash-123".to_string(), 10, 99) + .await + .unwrap(); + repository + .create_transaction(&"tx-hash-123".to_string(), 11, 100) + .await + .unwrap(); + let transaction_result = repository + .get_transaction(&"tx-hash-123".to_string()) + .await + .unwrap(); + + assert_eq!( + Some(CardanoTransactionRecord { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99 + }), + transaction_result + ); + } + + #[tokio::test] + async fn repository_store_transactions_and_get_stored_transactions() { + let connection = get_connection().await; + let repository = CardanoTransactionRepository::new(connection.clone()); + + let cardano_transactions = vec![ + CardanoTransaction { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99, + }, + CardanoTransaction { + transaction_hash: "tx-hash-456".to_string(), + block_number: 11, + immutable_file_number: 100, + }, + ]; + repository + .store_transactions(&cardano_transactions) + .await + .unwrap(); + + let transaction_result = repository + .get_transaction(&"tx-hash-123".to_string()) + .await + .unwrap(); + + assert_eq!( + Some(CardanoTransactionRecord { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99 + }), + transaction_result + ); + + let transaction_result = repository + .get_transaction(&"tx-hash-456".to_string()) + .await + .unwrap(); + + assert_eq!( + Some(CardanoTransactionRecord { + transaction_hash: "tx-hash-456".to_string(), + block_number: 11, + immutable_file_number: 100, + }), + transaction_result + ); + } + + #[tokio::test] + async fn repository_store_transactions_and_get_up_to_beacon_transactions() { + let connection = get_connection().await; + let repository = CardanoTransactionRepository::new(connection.clone()); + + let cardano_transactions: Vec = (20..=40) + .map(|i| CardanoTransaction { + transaction_hash: format!("tx-hash-{i}"), + block_number: i % 10, + immutable_file_number: i, + }) + .collect(); + repository + .store_transactions(&cardano_transactions) + .await + .unwrap(); + + let transaction_result = repository + .get_up_to(&Beacon::new("".to_string(), 1, 34)) + .await + .unwrap(); + + assert_eq!( + cardano_transactions[0..=14] + .iter() + .cloned() + .rev() + .collect::>(), + transaction_result + ); + + let transaction_result = repository + .get_up_to(&Beacon::new("".to_string(), 1, 300)) + .await + .unwrap(); + + assert_eq!( + cardano_transactions.into_iter().rev().collect::>(), + transaction_result + ); + + let transaction_result = repository + .get_up_to(&Beacon::new("".to_string(), 1, 19)) + .await + .unwrap(); + + assert_eq!(Vec::::new(), transaction_result); + } + + #[tokio::test] + async fn repository_store_transactions_and_get_all_stored_transactions() { + let connection = get_connection().await; + let repository = CardanoTransactionRepository::new(connection.clone()); + + let cardano_transactions = vec![ + CardanoTransaction { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99, + }, + CardanoTransaction { + transaction_hash: "tx-hash-456".to_string(), + block_number: 11, + immutable_file_number: 100, + }, + ]; + repository + .store_transactions(&cardano_transactions) + .await + .unwrap(); + + let transactions_result = repository.get_all_transactions().await.unwrap(); + let transactions_expected: Vec = cardano_transactions + .iter() + .rev() + .map(|tx| tx.clone().into()) + .collect(); + + assert_eq!(transactions_expected, transactions_result); + } + + #[tokio::test] + async fn repository_store_transactions_doesnt_erase_existing_data() { + let connection = get_connection().await; + let repository = CardanoTransactionRepository::new(connection.clone()); + + repository + .create_transaction(&"tx-hash-000".to_string(), 1, 9) + .await + .unwrap(); + + let cardano_transactions = vec![CardanoTransaction { + transaction_hash: "tx-hash-123".to_string(), + block_number: 10, + immutable_file_number: 99, + }]; + repository + .store_transactions(&cardano_transactions) + .await + .unwrap(); + + let transaction_result = repository + .get_transaction(&"tx-hash-000".to_string()) + .await + .unwrap(); + + assert_eq!( + Some(CardanoTransactionRecord { + transaction_hash: "tx-hash-000".to_string(), + block_number: 1, + immutable_file_number: 9 + }), + transaction_result + ); + } +} diff --git a/mithril-aggregator/src/database/provider/certificate.rs b/mithril-aggregator/src/database/provider/certificate.rs index 97eaf8bf11f..cd446773b1e 100644 --- a/mithril-aggregator/src/database/provider/certificate.rs +++ b/mithril-aggregator/src/database/provider/certificate.rs @@ -15,12 +15,11 @@ use mithril_common::{ CertificateListItemMessage, CertificateListItemMessageMetadata, CertificateMessage, CertificateMetadataMessagePart, }, - sqlite::{ - EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, - WhereCondition, - }, StdResult, }; +use mithril_persistence::sqlite::{ + EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, WhereCondition, +}; #[cfg(test)] use mithril_common::test_utils::fake_keys; diff --git a/mithril-aggregator/src/database/provider/epoch_setting.rs b/mithril-aggregator/src/database/provider/epoch_setting.rs index 19ccabdd130..9f1c43a6364 100644 --- a/mithril-aggregator/src/database/provider/epoch_setting.rs +++ b/mithril-aggregator/src/database/provider/epoch_setting.rs @@ -5,13 +5,13 @@ use std::sync::Arc; use mithril_common::{ entities::{Epoch, ProtocolParameters}, - sqlite::{ - EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, - SqliteConnection, WhereCondition, - }, - store::adapter::AdapterError, StdResult, }; +use mithril_persistence::sqlite::{ + EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, + SqliteConnection, WhereCondition, +}; +use mithril_persistence::store::adapter::AdapterError; use crate::ProtocolParametersStorer; diff --git a/mithril-aggregator/src/database/provider/mod.rs b/mithril-aggregator/src/database/provider/mod.rs index 271a37f2634..c729406ff7f 100644 --- a/mithril-aggregator/src/database/provider/mod.rs +++ b/mithril-aggregator/src/database/provider/mod.rs @@ -1,4 +1,5 @@ //! Aggregator related database providers +mod cardano_transaction; mod certificate; mod epoch_setting; mod open_message; @@ -10,6 +11,7 @@ mod stake_pool; #[cfg(test)] mod test_helper; +pub use cardano_transaction::*; pub use certificate::*; pub use epoch_setting::*; pub use open_message::*; diff --git a/mithril-aggregator/src/database/provider/open_message.rs b/mithril-aggregator/src/database/provider/open_message.rs index bfde09e40e1..3268c32ade3 100644 --- a/mithril-aggregator/src/database/provider/open_message.rs +++ b/mithril-aggregator/src/database/provider/open_message.rs @@ -1,12 +1,13 @@ use anyhow::Context; use mithril_common::{ entities::{Epoch, ProtocolMessage, SignedEntityType, SingleSignatures}, - sqlite::{ - HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, SqliteConnection, - WhereCondition, - }, StdResult, }; +use mithril_persistence::database::SignedEntityTypeHydrator; +use mithril_persistence::sqlite::{ + HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, SqliteConnection, + WhereCondition, +}; use chrono::{DateTime, Utc}; use sqlite::{Row, Value}; @@ -36,8 +37,14 @@ pub struct OpenMessageRecord { /// Has this open message been converted into a certificate? pub is_certified: bool, + /// Has this open message expired + pub is_expired: bool, + /// Message creation datetime, it is set by the database. pub created_at: DateTime, + + /// Message expiration datetime, if it exists. + pub expires_at: Option>, } impl OpenMessageRecord { @@ -54,7 +61,9 @@ impl OpenMessageRecord { signed_entity_type, protocol_message: ProtocolMessage::new(), is_certified: false, + is_expired: false, created_at: Utc::now(), + expires_at: None, } } } @@ -67,7 +76,9 @@ impl From for OpenMessageRecord { signed_entity_type: value.signed_entity_type, protocol_message: value.protocol_message, is_certified: value.is_certified, + is_expired: value.is_expired, created_at: value.created_at, + expires_at: value.expires_at, } } } @@ -107,23 +118,32 @@ impl SqLiteEntity for OpenMessageRecord { "Integer field open_message.signed_entity_type_id cannot be turned into usize: {e}" ) })?; - let signed_entity_type = SignedEntityType::hydrate(signed_entity_type_id, &beacon_str)?; + let signed_entity_type = + SignedEntityTypeHydrator::hydrate(signed_entity_type_id, &beacon_str)?; let is_certified = row.read::(5) != 0; - let datetime = &row.read::<&str, _>(6); + let datetime = &row.read::<&str, _>(7); let created_at = DateTime::parse_from_rfc3339(datetime).map_err(|e| { HydrationError::InvalidData(format!( "Could not turn open_message.created_at field value '{datetime}' to rfc3339 Datetime. Error: {e}" )) })?.with_timezone(&Utc); - + let is_expired = row.read::(6) != 0; + let datetime = &row.read::, _>(8); + let expires_at = datetime.map(|datetime| DateTime::parse_from_rfc3339(datetime).map_err(|e| { + HydrationError::InvalidData(format!( + "Could not turn open_message.expires_at field value '{datetime}' to rfc3339 Datetime. Error: {e}" + )) + })).transpose()?.map(|datetime| datetime.with_timezone(&Utc)); let open_message = Self { open_message_id, epoch: Epoch(epoch_val), signed_entity_type, protocol_message, is_certified, + is_expired, created_at, + expires_at, }; Ok(open_message) @@ -153,7 +173,9 @@ impl SqLiteEntity for OpenMessageRecord { "text", ), ("is_certified", "{:open_message:}.is_certified", "bool"), + ("is_expired", "{:open_message:}.is_expired", "bool"), ("created_at", "{:open_message:}.created_at", "text"), + ("expires_at", "{:open_message:}.expires_at", "text"), ]) } } @@ -184,6 +206,10 @@ impl<'client> OpenMessageProvider<'client> { )) } + fn get_expired_entity_type_condition(&self, now: &str) -> WhereCondition { + WhereCondition::new("expires_at < ?*", vec![Value::String(now.to_string())]) + } + // Useful in test and probably in the future. #[allow(dead_code)] fn get_open_message_id_condition(&self, open_message_id: &str) -> WhereCondition { @@ -227,7 +253,7 @@ impl<'client> InsertOpenMessageProvider<'client> { signed_entity_type: &SignedEntityType, protocol_message: &ProtocolMessage, ) -> StdResult { - let expression = "(open_message_id, epoch_setting_id, beacon, signed_entity_type_id, protocol_message, created_at) values (?*, ?*, ?*, ?*, ?*, ?*)"; + let expression = "(open_message_id, epoch_setting_id, beacon, signed_entity_type_id, protocol_message, expires_at, created_at) values (?*, ?*, ?*, ?*, ?*, ?*, ?*)"; let beacon_str = signed_entity_type.get_json_beacon()?; let parameters = vec![ Value::String(Uuid::new_v4().to_string()), @@ -235,6 +261,10 @@ impl<'client> InsertOpenMessageProvider<'client> { Value::String(beacon_str), Value::Integer(signed_entity_type.index() as i64), Value::String(serde_json::to_string(protocol_message)?), + signed_entity_type + .get_open_message_timeout() + .map(|t| Value::String((Utc::now() + t).to_rfc3339())) + .unwrap_or(Value::Null), Value::String(Utc::now().to_rfc3339()), ]; @@ -267,8 +297,8 @@ impl<'client> UpdateOpenMessageProvider<'client> { fn get_update_condition(&self, open_message: &OpenMessageRecord) -> StdResult { let expression = "epoch_setting_id = ?*, beacon = ?*, \ -signed_entity_type_id = ?*, protocol_message = ?*, is_certified = ?* \ -where open_message_id = ?*"; +signed_entity_type_id = ?*, protocol_message = ?*, is_certified = ?*, \ +is_expired = ?*, expires_at = ?* where open_message_id = ?*"; let beacon_str = open_message.signed_entity_type.get_json_beacon()?; let parameters = vec![ Value::Integer( @@ -281,6 +311,11 @@ where open_message_id = ?*"; Value::Integer(open_message.signed_entity_type.index() as i64), Value::String(serde_json::to_string(&open_message.protocol_message)?), Value::Integer(open_message.is_certified as i64), + Value::Integer(open_message.is_expired as i64), + open_message + .expires_at + .map(|d| Value::String(d.to_rfc3339())) + .unwrap_or(Value::Null), Value::String(open_message.open_message_id.to_string()), ]; @@ -350,11 +385,17 @@ pub struct OpenMessageWithSingleSignaturesRecord { /// Has this message been converted into a Certificate? pub is_certified: bool, + /// Has this open message expired + pub is_expired: bool, + /// associated single signatures pub single_signatures: Vec, /// Message creation datetime, it is set by the database. pub created_at: DateTime, + + /// Message expiration datetime, if it exists. + pub expires_at: Option>, } impl SqLiteEntity for OpenMessageWithSingleSignaturesRecord { @@ -362,7 +403,7 @@ impl SqLiteEntity for OpenMessageWithSingleSignaturesRecord { where Self: Sized, { - let single_signatures = &row.read::<&str, _>(7); + let single_signatures = &row.read::<&str, _>(9); let single_signatures: Vec = serde_json::from_str(single_signatures) .map_err(|e| { HydrationError::InvalidData(format!( @@ -378,8 +419,10 @@ impl SqLiteEntity for OpenMessageWithSingleSignaturesRecord { signed_entity_type: open_message.signed_entity_type, protocol_message: open_message.protocol_message, is_certified: open_message.is_certified, + is_expired: open_message.is_expired, single_signatures, created_at: open_message.created_at, + expires_at: open_message.expires_at, }; Ok(open_message) @@ -409,7 +452,9 @@ impl SqLiteEntity for OpenMessageWithSingleSignaturesRecord { "text", ), ("is_certified", "{:open_message:}.is_certified", "bool"), + ("is_expired", "{:open_message:}.is_expired", "bool"), ("created_at", "{:open_message:}.created_at", "text"), + ("expires_at", "{:open_message:}.expires_at", "text"), ( "single_signatures", "case when {:single_signature:}.signer_id is null then json('[]') \ @@ -523,6 +568,21 @@ impl OpenMessageRepository { Ok(messages.next()) } + /// Return the expired [OpenMessageRecord] for the given Epoch and [SignedEntityType] if it exists + pub async fn get_expired_open_message( + &self, + signed_entity_type: &SignedEntityType, + ) -> StdResult> { + let provider = OpenMessageProvider::new(&self.connection); + let now = Utc::now().to_rfc3339(); + let filters = provider + .get_expired_entity_type_condition(&now) + .and_where(provider.get_signed_entity_type_condition(signed_entity_type)?); + let mut messages = provider.find(filters)?; + + Ok(messages.next()) + } + /// Create a new [OpenMessageRecord] in the database. pub async fn create_open_message( &self, @@ -566,7 +626,8 @@ impl OpenMessageRepository { #[cfg(test)] mod tests { - use mithril_common::{entities::Beacon, sqlite::SourceAlias}; + use mithril_common::entities::Beacon; + use mithril_persistence::sqlite::SourceAlias; use sqlite::Connection; use crate::database::provider::{ @@ -609,7 +670,9 @@ values (1, '{"k": 100, "m": 5, "phi": 0.65 }'), (2, '{"k": 100, "m": 5, "phi": 0 '{ "message_parts": { "next_aggregate_verification_key":"7b226d745f636f6d6d69746d656e74223a7b22726f6f74223a5b3131312c3230352c3133392c3131322c32382c392c3233382c3134382c3133342c302c3230372c3233302c3234312c3130352c3135372c3131302c3232362c3131342c32362c35332c3136362c3235342c3230382c3132372c3231362c3230362c3230302c34382c35352c32312c3231372c31335d2c226e725f6c6561766573223a332c22686173686572223a6e756c6c7d2c22746f74616c5f7374616b65223a32383439323639303636317d" }}', - 1 + 1, + 0, + '2021-07-27T01:02:44.505640275+00:00' ); insert into single_signature values( @@ -638,7 +701,7 @@ values (1, '{"k": 100, "m": 5, "phi": 0.65 }'), (2, '{"k": 100, "m": 5, "phi": 0 .get_open_message(&SignedEntityType::MithrilStakeDistribution(Epoch(275))) .await .expect("Getting Golden open message should not fail") - .expect("A open message should exist for this signed entity type"); + .expect("An open message should exist for this signed entity type"); repository .get_open_message_with_single_signatures(&SignedEntityType::MithrilStakeDistribution( @@ -647,7 +710,7 @@ values (1, '{"k": 100, "m": 5, "phi": 0.65 }'), (2, '{"k": 100, "m": 5, "phi": 0 .await .expect("Getting Golden open message should not fail") .expect( - "A open message with single signatures should exist for this signed entity type", + "An open message with single signatures should exist for this signed entity type", ); } @@ -663,8 +726,11 @@ values (1, '{"k": 100, "m": 5, "phi": 0.65 }'), (2, '{"k": 100, "m": 5, "phi": 0 "open_message.open_message_id as open_message_id, \ open_message.epoch_setting_id as epoch_setting_id, open_message.beacon as beacon, \ open_message.signed_entity_type_id as signed_entity_type_id, \ -open_message.protocol_message as protocol_message, open_message.is_certified as is_certified, \ +open_message.protocol_message as protocol_message, \ +open_message.is_certified as is_certified, \ +open_message.is_expired as is_expired, \ open_message.created_at as created_at, \ +open_message.expires_at as expires_at, \ case when single_signature.signer_id is null then json('[]') \ else json_group_array( \ json_object( \ @@ -684,7 +750,7 @@ else json_group_array( \ let aliases = SourceAlias::new(&[("{:open_message:}", "open_message")]); assert_eq!( - "open_message.open_message_id as open_message_id, open_message.epoch_setting_id as epoch_setting_id, open_message.beacon as beacon, open_message.signed_entity_type_id as signed_entity_type_id, open_message.protocol_message as protocol_message, open_message.is_certified as is_certified, open_message.created_at as created_at".to_string(), + "open_message.open_message_id as open_message_id, open_message.epoch_setting_id as epoch_setting_id, open_message.beacon as beacon, open_message.signed_entity_type_id as signed_entity_type_id, open_message.protocol_message as protocol_message, open_message.is_certified as is_certified, open_message.is_expired as is_expired, open_message.created_at as created_at, open_message.expires_at as expires_at".to_string(), projection.expand(aliases) ) } @@ -745,6 +811,17 @@ else json_group_array( \ ); } + #[test] + fn provider_expired_entity_type_condition() { + let connection = Connection::open_thread_safe(":memory:").unwrap(); + let provider = OpenMessageProvider::new(&connection); + let now = Utc::now().to_rfc3339(); + let (expr, params) = provider.get_expired_entity_type_condition(&now).expand(); + + assert_eq!("expires_at < ?1".to_string(), expr); + assert_eq!(vec![Value::String(now)], params); + } + #[test] fn insert_provider_condition() { let connection = Connection::open_thread_safe(":memory:").unwrap(); @@ -763,7 +840,7 @@ else json_group_array( \ .unwrap() .expand(); - assert_eq!("(open_message_id, epoch_setting_id, beacon, signed_entity_type_id, protocol_message, created_at) values (?1, ?2, ?3, ?4, ?5, ?6)".to_string(), expr); + assert_eq!("(open_message_id, epoch_setting_id, beacon, signed_entity_type_id, protocol_message, expires_at, created_at) values (?1, ?2, ?3, ?4, ?5, ?6, ?7)".to_string(), expr); assert_eq!(Value::Integer(12), params[1]); assert_eq!( Value::String( @@ -788,7 +865,9 @@ else json_group_array( \ signed_entity_type: SignedEntityType::dummy(), protocol_message: ProtocolMessage::new(), is_certified: true, + is_expired: false, created_at: DateTime::::default(), + expires_at: None, }; let (expr, params) = provider .get_update_condition(&open_message) @@ -796,7 +875,7 @@ else json_group_array( \ .expand(); assert_eq!( - "epoch_setting_id = ?1, beacon = ?2, signed_entity_type_id = ?3, protocol_message = ?4, is_certified = ?5 where open_message_id = ?6" + "epoch_setting_id = ?1, beacon = ?2, signed_entity_type_id = ?3, protocol_message = ?4, is_certified = ?5, is_expired = ?6, expires_at = ?7 where open_message_id = ?8" .to_string(), expr ); @@ -807,6 +886,11 @@ else json_group_array( \ Value::Integer(open_message.signed_entity_type.index() as i64), Value::String(serde_json::to_string(&open_message.protocol_message).unwrap()), Value::Integer(open_message.is_certified as i64), + Value::Integer(open_message.is_expired as i64), + open_message + .expires_at + .map(|d| Value::String(d.to_rfc3339())) + .unwrap_or(Value::Null), Value::String(open_message.open_message_id.to_string()), ], params @@ -829,27 +913,21 @@ else json_group_array( \ let repository = OpenMessageRepository::new(connection.clone()); let beacon = Beacon::new("devnet".to_string(), 1, 1); - let signed_entity_type = SignedEntityType::MithrilStakeDistribution(beacon.epoch); - repository - .create_open_message(beacon.epoch, &signed_entity_type, &ProtocolMessage::new()) - .await - .unwrap(); - let open_message_result = repository - .get_open_message(&signed_entity_type) - .await - .unwrap(); - assert!(open_message_result.is_some()); - - let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(beacon.clone()); - repository - .create_open_message(beacon.epoch, &signed_entity_type, &ProtocolMessage::new()) - .await - .unwrap(); - let open_message_result = repository - .get_open_message(&signed_entity_type) - .await - .unwrap(); - assert!(open_message_result.is_some()); + for signed_entity_type in [ + SignedEntityType::MithrilStakeDistribution(beacon.epoch), + SignedEntityType::CardanoImmutableFilesFull(beacon.clone()), + SignedEntityType::CardanoTransactions(beacon.clone()), + ] { + repository + .create_open_message(beacon.epoch, &signed_entity_type, &ProtocolMessage::new()) + .await + .unwrap(); + let open_message_result = repository + .get_open_message(&signed_entity_type) + .await + .unwrap(); + assert!(open_message_result.is_some()); + } } #[tokio::test] diff --git a/mithril-aggregator/src/database/provider/signed_entity.rs b/mithril-aggregator/src/database/provider/signed_entity.rs index be8ba8a3045..735b89e5c39 100644 --- a/mithril-aggregator/src/database/provider/signed_entity.rs +++ b/mithril-aggregator/src/database/provider/signed_entity.rs @@ -7,18 +7,24 @@ use std::sync::Arc; use mithril_common::{ crypto_helper::ProtocolParameters, - entities::{Epoch, SignedEntity, SignedEntityType, SignedEntityTypeDiscriminants, Snapshot}, + entities::{ + Beacon, Epoch, SignedEntity, SignedEntityType, SignedEntityTypeDiscriminants, Snapshot, + }, messages::{ + CardanoTransactionCommitmentListItemMessage, CardanoTransactionCommitmentMessage, MithrilStakeDistributionListItemMessage, MithrilStakeDistributionMessage, SignerWithStakeMessagePart, SnapshotListItemMessage, SnapshotMessage, }, signable_builder::Artifact, + StdError, StdResult, +}; +use mithril_persistence::{ + database::SignedEntityTypeHydrator, sqlite::{ EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, SqliteConnection, WhereCondition, }, store::adapter::AdapterError, - StdError, StdResult, }; #[cfg(test)] @@ -134,6 +140,52 @@ impl TryFrom for MithrilStakeDistributionListItemMessage { } } +impl TryFrom for CardanoTransactionCommitmentMessage { + type Error = StdError; + + fn try_from(value: SignedEntityRecord) -> Result { + #[derive(Deserialize)] + struct TmpCardanoTransaction { + merkle_root: String, + beacon: Beacon, + hash: String, + } + let artifact = serde_json::from_str::(&value.artifact)?; + let cardano_transaction_message = CardanoTransactionCommitmentMessage { + merkle_root: artifact.merkle_root, + beacon: artifact.beacon, + hash: artifact.hash, + certificate_hash: value.certificate_id, + created_at: value.created_at, + }; + + Ok(cardano_transaction_message) + } +} + +impl TryFrom for CardanoTransactionCommitmentListItemMessage { + type Error = StdError; + + fn try_from(value: SignedEntityRecord) -> Result { + #[derive(Deserialize)] + struct TmpCardanoTransaction { + merkle_root: String, + beacon: Beacon, + hash: String, + } + let artifact = serde_json::from_str::(&value.artifact)?; + let message = CardanoTransactionCommitmentListItemMessage { + merkle_root: artifact.merkle_root, + beacon: artifact.beacon, + hash: artifact.hash, + certificate_hash: value.certificate_id, + created_at: value.created_at, + }; + + Ok(message) + } +} + impl TryFrom for SnapshotListItemMessage { type Error = StdError; @@ -175,7 +227,7 @@ impl SqLiteEntity for SignedEntityRecord { let signed_entity_record = Self { signed_entity_id, - signed_entity_type: SignedEntityType::hydrate( + signed_entity_type: SignedEntityTypeHydrator::hydrate( signed_entity_type_id_int.try_into().map_err(|e| { HydrationError::InvalidData(format!( "Could not cast i64 ({signed_entity_type_id_int}) to u64. Error: '{e}'" diff --git a/mithril-aggregator/src/database/provider/signer.rs b/mithril-aggregator/src/database/provider/signer.rs index 551a4f9e592..c0ca5b6e88c 100644 --- a/mithril-aggregator/src/database/provider/signer.rs +++ b/mithril-aggregator/src/database/provider/signer.rs @@ -5,10 +5,11 @@ use std::collections::HashMap; use std::iter::repeat; use std::sync::Arc; -use mithril_common::sqlite::{ - EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, WhereCondition, +use mithril_common::StdResult; +use mithril_persistence::sqlite::{ + EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, + SqliteConnection, WhereCondition, }; -use mithril_common::{sqlite::SqliteConnection, StdResult}; use crate::signer_registerer::SignerRecorder; diff --git a/mithril-aggregator/src/database/provider/signer_registration.rs b/mithril-aggregator/src/database/provider/signer_registration.rs index ff246edcce8..fc932678570 100644 --- a/mithril-aggregator/src/database/provider/signer_registration.rs +++ b/mithril-aggregator/src/database/provider/signer_registration.rs @@ -10,13 +10,13 @@ use mithril_common::{ Epoch, HexEncodedOpCert, HexEncodedVerificationKey, HexEncodedVerificationKeySignature, PartyId, Signer, SignerWithStake, Stake, }, - sqlite::{ - EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, - SqliteConnection, WhereCondition, - }, - store::adapter::AdapterError, StdResult, }; +use mithril_persistence::sqlite::{ + EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, + SqliteConnection, WhereCondition, +}; +use mithril_persistence::store::adapter::AdapterError; use crate::VerificationKeyStorer; @@ -292,7 +292,7 @@ impl<'conn> InsertOrReplaceSignerRegistrationRecordProvider<'conn> { .unwrap_or(Value::Null), signer_registration_record .kes_period - .map(|k| Value::Integer(i64::try_from(k).unwrap())) + .map(|k| Value::Integer(i64::from(k))) .unwrap_or(Value::Null), signer_registration_record .stake diff --git a/mithril-aggregator/src/database/provider/single_signature.rs b/mithril-aggregator/src/database/provider/single_signature.rs index 4c2a1040738..29f90ab8bf2 100644 --- a/mithril-aggregator/src/database/provider/single_signature.rs +++ b/mithril-aggregator/src/database/provider/single_signature.rs @@ -6,12 +6,12 @@ use uuid::Uuid; use mithril_common::{ entities::{Epoch, HexEncodedSingleSignature, LotteryIndex, SingleSignatures}, - sqlite::{ - EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, - SqliteConnection, WhereCondition, - }, StdError, StdResult, }; +use mithril_persistence::sqlite::{ + EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, + SqliteConnection, WhereCondition, +}; use super::OpenMessageRecord; diff --git a/mithril-aggregator/src/database/provider/stake_pool.rs b/mithril-aggregator/src/database/provider/stake_pool.rs index 00cdd0fed14..a7747d3040a 100644 --- a/mithril-aggregator/src/database/provider/stake_pool.rs +++ b/mithril-aggregator/src/database/provider/stake_pool.rs @@ -8,13 +8,13 @@ use std::sync::Arc; use mithril_common::{ entities::{Epoch, PartyId, Stake, StakeDistribution}, - sqlite::{ - EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, - SqliteConnection, WhereCondition, - }, - store::{adapter::AdapterError, StakeStorer}, StdResult, }; +use mithril_persistence::sqlite::{ + EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, + SqliteConnection, WhereCondition, +}; +use mithril_persistence::store::{adapter::AdapterError, StakeStorer}; /// Stake pool as read from Chain. #[derive(Debug, PartialEq)] diff --git a/mithril-aggregator/src/database/provider/test_helper.rs b/mithril-aggregator/src/database/provider/test_helper.rs index 1fbcf944d14..79f8f2ea809 100644 --- a/mithril-aggregator/src/database/provider/test_helper.rs +++ b/mithril-aggregator/src/database/provider/test_helper.rs @@ -3,7 +3,8 @@ use chrono::Utc; use sqlite::Value; use uuid::Uuid; -use mithril_common::{entities::Epoch, sqlite::SqliteConnection, test_utils::fake_keys, StdResult}; +use mithril_common::{entities::Epoch, test_utils::fake_keys, StdResult}; +use mithril_persistence::sqlite::SqliteConnection; use crate::database::{migration::get_migrations, provider::UpdateSingleSignatureRecordProvider}; diff --git a/mithril-aggregator/src/dependency_injection/builder.rs b/mithril-aggregator/src/dependency_injection/builder.rs index 75050f8e72b..d326f06d94d 100644 --- a/mithril-aggregator/src/dependency_injection/builder.rs +++ b/mithril-aggregator/src/dependency_injection/builder.rs @@ -1,10 +1,9 @@ -use std::sync::Arc; - use anyhow::Context; use semver::Version; use slog::Logger; use slog_scope::debug; use sqlite::Connection; +use std::sync::Arc; use tokio::{ sync::{ mpsc::{UnboundedReceiver, UnboundedSender}, @@ -16,14 +15,12 @@ use warp::Filter; use mithril_common::{ api_version::APIVersionProvider, + cardano_transaction_parser::{CardanoTransactionParser, TransactionParser}, certificate_chain::{CertificateVerifier, MithrilCertificateVerifier}, - chain_observer::{ - CardanoCliChainObserver, CardanoCliRunner, ChainObserver, FakeObserver, PallasChainObserver, - }, + chain_observer::{CardanoCliRunner, ChainObserver, ChainObserverBuilder, FakeObserver}, crypto_helper::{ ProtocolGenesisSigner, ProtocolGenesisVerificationKey, ProtocolGenesisVerifier, }, - database::{ApplicationNodeType, DatabaseVersionChecker}, digesters::{ cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProviderBuilder}, CardanoImmutableDigester, DumbImmutableFileObserver, ImmutableDigester, @@ -37,28 +34,36 @@ use mithril_common::{ signable_builder::{ CardanoImmutableFilesFullSignableBuilder, MithrilStakeDistributionSignableBuilder, }, - signable_builder::{MithrilSignableBuilderService, SignableBuilderService}, + signable_builder::{ + CardanoTransactionsSignableBuilder, MithrilSignableBuilderService, SignableBuilderService, + TransactionStore, + }, + BeaconProvider, BeaconProviderImpl, +}; +use mithril_persistence::{ + database::{ApplicationNodeType, DatabaseVersionChecker, SqlMigration}, sqlite::SqliteConnection, store::adapter::{MemoryAdapter, SQLiteAdapter, StoreAdapter}, - BeaconProvider, BeaconProviderImpl, }; use crate::{ artifact_builder::{ - CardanoImmutableFilesFullArtifactBuilder, MithrilStakeDistributionArtifactBuilder, + CardanoImmutableFilesFullArtifactBuilder, CardanoTransactionsArtifactBuilder, + MithrilStakeDistributionArtifactBuilder, }, configuration::ExecutionEnvironment, database::provider::{ - CertificateRepository, EpochSettingStore, OpenMessageRepository, SignedEntityStoreAdapter, - SignedEntityStorer, SignerRegistrationStore, SignerStore, SingleSignatureRepository, - StakePoolStore, + CardanoTransactionRepository, CertificateRepository, EpochSettingStore, + OpenMessageRepository, SignedEntityStoreAdapter, SignedEntityStorer, + SignerRegistrationStore, SignerStore, SingleSignatureRepository, StakePoolStore, }, event_store::{EventMessage, EventStore, TransmitterService}, http_server::routes::router, services::{ CertifierService, MessageService, MithrilCertifierService, MithrilEpochService, - MithrilMessageService, MithrilSignedEntityService, MithrilStakeDistributionService, - MithrilTickerService, SignedEntityService, StakeDistributionService, TickerService, + MithrilMessageService, MithrilProverService, MithrilSignedEntityService, + MithrilStakeDistributionService, MithrilTickerService, ProverService, SignedEntityService, + StakeDistributionService, TickerService, }, tools::{CExplorerSignerRetriever, GcpFileUploader, GenesisToolsDependency, SignersImporter}, AggregatorConfig, AggregatorRunner, AggregatorRuntime, CertificatePendingStore, @@ -71,6 +76,7 @@ use crate::{ use super::{DependenciesBuilderError, EpochServiceWrapper, Result}; const SQLITE_FILE: &str = "aggregator.sqlite3"; +const SQLITE_FILE_CARDANO_TRANSACTION: &str = "cardano-transaction.sqlite3"; /// ## Dependencies container builder /// @@ -90,6 +96,9 @@ pub struct DependenciesBuilder { /// SQLite database connection pub sqlite_connection: Option>, + /// Cardano transactions SQLite database connection + pub transaction_sqlite_connection: Option>, + /// Stake Store used by the StakeDistributionService /// It shall be a private dependency. pub stake_store: Option>, @@ -106,6 +115,9 @@ pub struct DependenciesBuilder { /// Certificate repository. pub certificate_repository: Option>, + /// Open message repository. + pub open_message_repository: Option>, + /// Verification key store. pub verification_key_store: Option>, @@ -121,6 +133,15 @@ pub struct DependenciesBuilder { /// Beacon provider service. pub beacon_provider: Option>, + /// Cardano transactions repository. + pub transaction_repository: Option>, + + /// Cardano transactions store. + pub transaction_store: Option>, + + /// Cardano transactions parser. + pub transaction_parser: Option>, + /// Immutable file digester service. pub immutable_digester: Option>, @@ -192,6 +213,9 @@ pub struct DependenciesBuilder { /// HTTP Message service pub message_service: Option>, + + /// Prover service + pub prover_service: Option>, } impl DependenciesBuilder { @@ -200,16 +224,21 @@ impl DependenciesBuilder { Self { configuration, sqlite_connection: None, + transaction_sqlite_connection: None, stake_store: None, snapshot_uploader: None, multi_signer: None, certificate_pending_store: None, certificate_repository: None, + open_message_repository: None, verification_key_store: None, protocol_parameters_store: None, cardano_cli_runner: None, chain_observer: None, beacon_provider: None, + transaction_parser: None, + transaction_repository: None, + transaction_store: None, immutable_digester: None, immutable_file_observer: None, immutable_cache_provider: None, @@ -233,15 +262,28 @@ impl DependenciesBuilder { epoch_service: None, signed_entity_storer: None, message_service: None, + prover_service: None, } } - async fn build_sqlite_connection(&self) -> Result> { + async fn build_sqlite_connection( + &self, + sqlite_file_name: &str, + migrations: Vec, + ) -> Result> { let path = match self.configuration.environment { ExecutionEnvironment::Production => { - self.configuration.get_sqlite_dir().join(SQLITE_FILE) + self.configuration.get_sqlite_dir().join(sqlite_file_name) + } + _ => { + if self.configuration.data_stores_directory.to_string_lossy() == ":memory:" { + self.configuration.data_stores_directory.clone() + } else { + self.configuration + .data_stores_directory + .join(sqlite_file_name) + } } - _ => self.configuration.data_stores_directory.clone(), }; let connection = Connection::open_thread_safe(&path) @@ -261,7 +303,7 @@ impl DependenciesBuilder { connection.as_ref(), ); - for migration in crate::database::migration::get_migrations() { + for migration in migrations { db_checker.add_migration(migration); } @@ -288,21 +330,52 @@ impl DependenciesBuilder { Ok(connection) } - async fn drop_sqlite_connection(&self) { + async fn drop_sqlite_connections(&self) { if let Some(connection) = &self.sqlite_connection { let _ = connection.execute("pragma analysis_limit=400; pragma optimize;"); } + + if let Some(connection) = &self.transaction_sqlite_connection { + let _ = connection.execute("pragma analysis_limit=400; pragma optimize;"); + } } /// Get SQLite connection pub async fn get_sqlite_connection(&mut self) -> Result> { if self.sqlite_connection.is_none() { - self.sqlite_connection = Some(self.build_sqlite_connection().await?); + self.sqlite_connection = Some( + self.build_sqlite_connection( + SQLITE_FILE, + crate::database::migration::get_migrations(), + ) + .await?, + ); } Ok(self.sqlite_connection.as_ref().cloned().unwrap()) } + /// Get SQLite connection for the cardano transactions store + pub async fn get_sqlite_connection_cardano_transaction( + &mut self, + ) -> Result> { + if self.transaction_sqlite_connection.is_none() { + self.transaction_sqlite_connection = Some( + self.build_sqlite_connection( + SQLITE_FILE_CARDANO_TRANSACTION, + crate::database::cardano_transaction_migration::get_migrations(), + ) + .await?, + ); + } + + Ok(self + .transaction_sqlite_connection + .as_ref() + .cloned() + .unwrap()) + } + async fn build_stake_store(&mut self) -> Result> { let stake_pool_store = Arc::new(StakePoolStore::new( self.get_sqlite_connection().await?, @@ -430,6 +503,21 @@ impl DependenciesBuilder { Ok(self.certificate_repository.as_ref().cloned().unwrap()) } + async fn build_open_message_repository(&mut self) -> Result> { + Ok(Arc::new(OpenMessageRepository::new( + self.get_sqlite_connection().await?, + ))) + } + + /// Get a configured [OpenMessageRepository]. + pub async fn get_open_message_repository(&mut self) -> Result> { + if self.open_message_repository.is_none() { + self.open_message_repository = Some(self.build_open_message_repository().await?); + } + + Ok(self.open_message_repository.as_ref().cloned().unwrap()) + } + async fn build_verification_key_store(&mut self) -> Result> { Ok(Arc::new(SignerRegistrationStore::new( self.get_sqlite_connection().await?, @@ -468,15 +556,23 @@ impl DependenciesBuilder { async fn build_chain_observer(&mut self) -> Result> { let chain_observer: Arc = match self.configuration.environment { ExecutionEnvironment::Production => { - let fallback = CardanoCliChainObserver::new(self.get_cardano_cli_runner().await?); - let observer = PallasChainObserver::new( - &self.configuration.cardano_node_socket_path, - self.configuration.get_network().with_context(|| { - "Dependencies Builder can not get Cardano network while building cardano cli runner" - })?, - fallback, + let cardano_cli_runner = &self.get_cardano_cli_runner().await?; + let chain_observer_type = &self.configuration.chain_observer_type; + let cardano_node_socket_path = &self.configuration.cardano_node_socket_path; + let cardano_network = &self + .configuration + .get_network() + .with_context(|| "Dependencies Builder can not get Cardano network while building the chain observer")?; + let chain_observer_builder = ChainObserverBuilder::new( + chain_observer_type, + cardano_node_socket_path, + cardano_network, + Some(cardano_cli_runner), ); - Arc::new(observer) + + chain_observer_builder + .build() + .with_context(|| "Dependencies Builder can not build chain observer")? } _ => Arc::new(FakeObserver::default()), }; @@ -592,6 +688,55 @@ impl DependenciesBuilder { self.create_logger().await } + async fn build_transaction_repository(&mut self) -> Result> { + let transaction_store = CardanoTransactionRepository::new( + self.get_sqlite_connection_cardano_transaction().await?, + ); + + Ok(Arc::new(transaction_store)) + } + + /// Transaction repository. + pub async fn get_transaction_repository( + &mut self, + ) -> Result> { + if self.transaction_repository.is_none() { + self.transaction_repository = Some(self.build_transaction_repository().await?); + } + + Ok(self.transaction_repository.as_ref().cloned().unwrap()) + } + + async fn build_transaction_store(&mut self) -> Result> { + let transaction_store = self.get_transaction_repository().await?; + + Ok(transaction_store as Arc) + } + + /// Transaction store. + pub async fn get_transaction_store(&mut self) -> Result> { + if self.transaction_store.is_none() { + self.transaction_store = Some(self.build_transaction_store().await?); + } + + Ok(self.transaction_store.as_ref().cloned().unwrap()) + } + + async fn build_transaction_parser(&mut self) -> Result> { + let transaction_parser = CardanoTransactionParser::default(); + + Ok(Arc::new(transaction_parser)) + } + + /// Transaction parser. + pub async fn get_transaction_parser(&mut self) -> Result> { + if self.transaction_parser.is_none() { + self.transaction_parser = Some(self.build_transaction_parser().await?); + } + + Ok(self.transaction_parser.as_ref().cloned().unwrap()) + } + async fn build_immutable_digester(&mut self) -> Result> { let immutable_digester_cache = match self.configuration.environment { ExecutionEnvironment::Production => Some(self.get_immutable_cache_provider().await?), @@ -913,9 +1058,16 @@ impl DependenciesBuilder { &self.configuration.db_directory, self.get_logger().await?, )); + let cardano_transactions_builder = Arc::new(CardanoTransactionsSignableBuilder::new( + self.get_transaction_parser().await?, + self.get_transaction_store().await?, + &self.configuration.db_directory, + self.get_logger().await?, + )); let signable_builder_service = Arc::new(MithrilSignableBuilderService::new( mithril_stake_distribution_builder, immutable_signable_builder, + cardano_transactions_builder, )); Ok(signable_builder_service) @@ -948,10 +1100,13 @@ impl DependenciesBuilder { snapshot_uploader, self.configuration.snapshot_compression_algorithm, )); + let cardano_transactions_artifact_builder = + Arc::new(CardanoTransactionsArtifactBuilder::new()); let signed_entity_service = Arc::new(MithrilSignedEntityService::new( signed_entity_storer, mithril_stake_distribution_artifact_builder, cardano_immutable_files_full_artifact_builder, + cardano_transactions_artifact_builder, )); Ok(signed_entity_service) @@ -1010,11 +1165,13 @@ impl DependenciesBuilder { let dependency_manager = DependencyContainer { config: self.configuration.clone(), sqlite_connection: self.get_sqlite_connection().await?, + sqlite_connection_transaction: self.get_sqlite_connection_cardano_transaction().await?, stake_store: self.get_stake_store().await?, snapshot_uploader: self.get_snapshot_uploader().await?, multi_signer: self.get_multi_signer().await?, certificate_pending_store: self.get_certificate_pending_store().await?, certificate_repository: self.get_certificate_repository().await?, + open_message_repository: self.get_open_message_repository().await?, verification_key_store: self.get_verification_key_store().await?, protocol_parameters_store: self.get_protocol_parameters_store().await?, chain_observer: self.get_chain_observer().await?, @@ -1040,6 +1197,9 @@ impl DependenciesBuilder { signed_entity_storer: self.get_signed_entity_storer().await?, signer_getter: self.get_signer_store().await?, message_service: self.get_message_service().await?, + transaction_parser: self.get_transaction_parser().await?, + transaction_store: self.get_transaction_store().await?, + prover_service: self.get_prover_service().await?, }; Ok(dependency_manager) @@ -1189,9 +1349,7 @@ impl DependenciesBuilder { /// Create [CertifierService] service pub async fn build_certifier_service(&mut self) -> Result> { - let open_message_repository = Arc::new(OpenMessageRepository::new( - self.get_sqlite_connection().await?, - )); + let open_message_repository = self.get_open_message_repository().await?; let single_signature_repository = Arc::new(SingleSignatureRepository::new( self.get_sqlite_connection().await?, )); @@ -1245,8 +1403,25 @@ impl DependenciesBuilder { Ok(self.message_service.as_ref().cloned().unwrap()) } + /// build Prover service + pub async fn build_prover_service(&mut self) -> Result> { + let transaction_retriever = self.get_transaction_repository().await?; + let service = MithrilProverService::new(transaction_retriever); + + Ok(Arc::new(service)) + } + + /// [ProverService] service + pub async fn get_prover_service(&mut self) -> Result> { + if self.prover_service.is_none() { + self.prover_service = Some(self.build_prover_service().await?); + } + + Ok(self.prover_service.as_ref().cloned().unwrap()) + } + /// Remove the dependencies builder from memory to release Arc instances. pub async fn vanish(self) { - self.drop_sqlite_connection().await; + self.drop_sqlite_connections().await; } } diff --git a/mithril-aggregator/src/dependency_injection/containers.rs b/mithril-aggregator/src/dependency_injection/containers.rs index ad5d3d9938c..31cb1cc89da 100644 --- a/mithril-aggregator/src/dependency_injection/containers.rs +++ b/mithril-aggregator/src/dependency_injection/containers.rs @@ -3,31 +3,37 @@ use tokio::sync::RwLock; use mithril_common::{ api_version::APIVersionProvider, + cardano_transaction_parser::TransactionParser, certificate_chain::CertificateVerifier, chain_observer::ChainObserver, crypto_helper::ProtocolGenesisVerifier, digesters::{ImmutableDigester, ImmutableFileObserver}, entities::{Epoch, ProtocolParameters, SignerWithStake, StakeDistribution}, era::{EraChecker, EraReader}, - signable_builder::SignableBuilderService, - sqlite::SqliteConnection, - store::StakeStorer, + signable_builder::{SignableBuilderService, TransactionStore}, test_utils::MithrilFixture, BeaconProvider, }; +use mithril_persistence::{sqlite::SqliteConnection, store::StakeStorer}; -use crate::services::{EpochService, MessageService}; use crate::{ configuration::*, database::provider::{CertificateRepository, SignedEntityStorer, SignerGetter, StakePoolStore}, event_store::{EventMessage, TransmitterService}, multi_signer::MultiSigner, - services::{CertifierService, SignedEntityService, StakeDistributionService, TickerService}, + services::{ + CertifierService, ProverService, SignedEntityService, StakeDistributionService, + TickerService, + }, signer_registerer::SignerRecorder, snapshot_uploaders::SnapshotUploader, CertificatePendingStore, ProtocolParametersStorer, SignerRegisterer, SignerRegistrationRoundOpener, Snapshotter, VerificationKeyStorer, }; +use crate::{ + database::provider::OpenMessageRepository, + services::{EpochService, MessageService}, +}; /// MultiSignerWrapper wraps a [MultiSigner] pub type MultiSignerWrapper = Arc>; @@ -45,6 +51,9 @@ pub struct DependencyContainer { /// services. Shall be private dependency. pub sqlite_connection: Arc, + /// SQLite database connection for Cardano transactions + pub sqlite_connection_transaction: Arc, + /// Stake Store used by the StakeDistributionService /// It shall be a private dependency. pub stake_store: Arc, @@ -61,6 +70,9 @@ pub struct DependencyContainer { /// Certificate store. pub certificate_repository: Arc, + /// Open message store. + pub open_message_repository: Arc, + /// Verification key store. pub verification_key_store: Arc, @@ -73,6 +85,12 @@ pub struct DependencyContainer { /// Beacon provider service. pub beacon_provider: Arc, + /// Cardano transactions store. + pub transaction_store: Arc, + + /// Cardano transactions parser. + pub transaction_parser: Arc, + /// Immutable file observer service. pub immutable_file_observer: Arc, @@ -135,6 +153,9 @@ pub struct DependencyContainer { /// HTTP message service pub message_service: Arc, + + /// Prover service + pub prover_service: Arc, } #[doc(hidden)] diff --git a/mithril-aggregator/src/entities/open_message.rs b/mithril-aggregator/src/entities/open_message.rs index b8dfa92e06a..a6e6beca151 100644 --- a/mithril-aggregator/src/entities/open_message.rs +++ b/mithril-aggregator/src/entities/open_message.rs @@ -24,11 +24,17 @@ pub struct OpenMessage { /// Has this message been converted into a Certificate? pub is_certified: bool, + /// Has this open message expired + pub is_expired: bool, + /// associated single signatures pub single_signatures: Vec, /// Message creation datetime pub created_at: DateTime, + + /// Message expiration datetime, if it exists. + pub expires_at: Option>, } impl OpenMessage { @@ -54,11 +60,13 @@ impl OpenMessage { signed_entity_type, protocol_message: ProtocolMessage::new(), is_certified: false, + is_expired: false, single_signatures: vec![ fake_data::single_signatures(vec![1, 4, 5]), fake_data::single_signatures(vec![2, 3, 8]), ], created_at: Utc::now(), + expires_at: None, } } } @@ -70,8 +78,10 @@ impl From for OpenMessage { signed_entity_type: record.signed_entity_type, protocol_message: record.protocol_message, is_certified: record.is_certified, + is_expired: record.is_expired, single_signatures: vec![], created_at: record.created_at, + expires_at: record.expires_at, } } } @@ -83,8 +93,10 @@ impl From for OpenMessage { signed_entity_type: record.signed_entity_type, protocol_message: record.protocol_message, is_certified: record.is_certified, + is_expired: record.is_expired, single_signatures: record.single_signatures, created_at: record.created_at, + expires_at: record.expires_at, } } } @@ -111,15 +123,19 @@ mod test { signed_entity_type: SignedEntityType::dummy(), protocol_message: ProtocolMessage::default(), is_certified: false, + is_expired: false, created_at, + expires_at: None, }; let expected = OpenMessage { epoch: Epoch(1), signed_entity_type: SignedEntityType::dummy(), protocol_message: ProtocolMessage::default(), is_certified: false, + is_expired: false, single_signatures: vec![], created_at, + expires_at: None, }; let result: OpenMessage = record.into(); @@ -135,7 +151,9 @@ mod test { signed_entity_type: SignedEntityType::dummy(), protocol_message: ProtocolMessage::default(), is_certified: false, + is_expired: false, created_at, + expires_at: None, single_signatures: vec![fake_data::single_signatures(vec![1, 4, 5])], }; let expected = OpenMessage { @@ -143,8 +161,10 @@ mod test { signed_entity_type: SignedEntityType::dummy(), protocol_message: ProtocolMessage::default(), is_certified: false, + is_expired: false, single_signatures: vec![fake_data::single_signatures(vec![1, 4, 5])], created_at, + expires_at: None, }; let result: OpenMessage = record.into(); diff --git a/mithril-aggregator/src/event_store/event.rs b/mithril-aggregator/src/event_store/event.rs index 74d56d030d6..61994ab9db3 100644 --- a/mithril-aggregator/src/event_store/event.rs +++ b/mithril-aggregator/src/event_store/event.rs @@ -3,11 +3,11 @@ use chrono::{DateTime, Utc}; use std::{collections::HashMap, sync::Arc}; -use mithril_common::sqlite::{ +use mithril_common::StdResult; +use mithril_persistence::sqlite::{ HydrationError, Projection, Provider, SourceAlias, SqLiteEntity, SqliteConnection, WhereCondition, }; -use mithril_common::StdResult; /// Event that is sent from a thread to be persisted. #[derive(Debug, Clone)] diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs new file mode 100644 index 00000000000..6ae53211026 --- /dev/null +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs @@ -0,0 +1,279 @@ +use crate::http_server::routes::middlewares; +use crate::DependencyContainer; +use std::sync::Arc; +use warp::Filter; + +pub fn routes( + dependency_manager: Arc, +) -> impl Filter + Clone { + artifact_cardano_transactions(dependency_manager.clone()) + .or(artifact_cardano_transaction_by_id(dependency_manager)) +} + +/// GET /artifact/cardano-transactions +fn artifact_cardano_transactions( + dependency_manager: Arc, +) -> impl Filter + Clone { + warp::path!("artifact" / "cardano-transactions") + .and(warp::get()) + .and(middlewares::with_http_message_service(dependency_manager)) + .and_then(handlers::list_artifacts) +} + +/// GET /artifact/cardano-transaction/:id +fn artifact_cardano_transaction_by_id( + dependency_manager: Arc, +) -> impl Filter + Clone { + warp::path!("artifact" / "cardano-transaction" / String) + .and(warp::get()) + .and(middlewares::with_http_message_service(dependency_manager)) + .and_then(handlers::get_artifact_by_signed_entity_id) +} + +pub mod handlers { + use crate::http_server::routes::reply; + use crate::services::MessageService; + + use slog_scope::{debug, warn}; + use std::convert::Infallible; + use std::sync::Arc; + use warp::http::StatusCode; + + pub const LIST_MAX_ITEMS: usize = 20; + + /// List Cardano Transactions set artifacts + pub async fn list_artifacts( + http_message_service: Arc, + ) -> Result { + debug!("⇄ HTTP SERVER: artifacts"); + + match http_message_service + .get_cardano_transaction_list_message(LIST_MAX_ITEMS) + .await + { + Ok(message) => Ok(reply::json(&message, StatusCode::OK)), + Err(err) => { + warn!("list_artifacts_cardano_transactions"; "error" => ?err); + + Ok(reply::internal_server_error(err)) + } + } + } + + /// Get Artifact by signed entity id + pub async fn get_artifact_by_signed_entity_id( + signed_entity_id: String, + http_message_service: Arc, + ) -> Result { + debug!("⇄ HTTP SERVER: artifact/{signed_entity_id}"); + + match http_message_service + .get_cardano_transaction_message(&signed_entity_id) + .await + { + Ok(Some(message)) => Ok(reply::json(&message, StatusCode::OK)), + Ok(None) => { + warn!("get_cardano_transaction_details::not_found"); + Ok(reply::empty(StatusCode::NOT_FOUND)) + } + Err(err) => { + warn!("get_cardano_transaction_details::error"; "error" => ?err); + Ok(reply::internal_server_error(err)) + } + } + } +} + +#[cfg(test)] +pub mod tests { + use crate::http_server::routes::artifact_routes::test_utils::*; + use crate::{ + http_server::SERVER_BASE_PATH, + initialize_dependencies, + message_adapters::{ + ToCardanoTransactionListMessageAdapter, ToCardanoTransactionMessageAdapter, + }, + services::MockMessageService, + }; + use mithril_common::{ + entities::{Beacon, SignedEntityType}, + messages::ToMessageAdapter, + test_utils::{apispec::APISpec, fake_data}, + }; + use mithril_persistence::sqlite::HydrationError; + use serde_json::Value::Null; + use warp::{http::Method, test::request}; + + use super::*; + + fn setup_router( + dependency_manager: Arc, + ) -> impl Filter + Clone { + let cors = warp::cors() + .allow_any_origin() + .allow_headers(vec!["content-type"]) + .allow_methods(vec![Method::GET, Method::POST, Method::OPTIONS]); + + warp::any() + .and(warp::path(SERVER_BASE_PATH)) + .and(routes(dependency_manager).with(cors)) + } + + #[tokio::test] + async fn test_cardano_transactions_get_ok() { + let signed_entity_records = create_signed_entities( + SignedEntityType::CardanoTransactions(Beacon::default()), + fake_data::cardano_transactions_commitment(5), + ); + let message = ToCardanoTransactionListMessageAdapter::adapt(signed_entity_records); + let mut mock_http_message_service = MockMessageService::new(); + mock_http_message_service + .expect_get_cardano_transaction_list_message() + .return_once(|_| Ok(message)) + .once(); + let mut dependency_manager = initialize_dependencies().await; + dependency_manager.message_service = Arc::new(mock_http_message_service); + + let method = Method::GET.as_str(); + let path = "/artifact/cardano-transactions"; + + let response = request() + .method(method) + .path(&format!("/{SERVER_BASE_PATH}{path}")) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } + + #[tokio::test] + async fn test_cardano_transactions_get_ko() { + let mut mock_http_message_service = MockMessageService::new(); + mock_http_message_service + .expect_get_cardano_transaction_list_message() + .return_once(|_| Err(HydrationError::InvalidData("invalid data".to_string()).into())) + .once(); + let mut dependency_manager = initialize_dependencies().await; + dependency_manager.message_service = Arc::new(mock_http_message_service); + + let method = Method::GET.as_str(); + let path = "/artifact/cardano-transactions"; + + let response = request() + .method(method) + .path(&format!("/{SERVER_BASE_PATH}{path}")) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } + + #[tokio::test] + async fn test_cardano_transaction_get_ok() { + let signed_entity = create_signed_entities( + SignedEntityType::CardanoTransactions(Beacon::default()), + fake_data::cardano_transactions_commitment(1), + ) + .first() + .unwrap() + .to_owned(); + let message = ToCardanoTransactionMessageAdapter::adapt(signed_entity); + let mut mock_http_message_service = MockMessageService::new(); + mock_http_message_service + .expect_get_cardano_transaction_message() + .return_once(|_| Ok(Some(message))) + .once(); + let mut dependency_manager = initialize_dependencies().await; + dependency_manager.message_service = Arc::new(mock_http_message_service); + + let method = Method::GET.as_str(); + let path = "/artifact/cardano-transaction/{hash}"; + + let response = request() + .method(method) + .path(&format!("/{SERVER_BASE_PATH}{path}")) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } + + #[tokio::test] + async fn test_cardano_transaction_ok_norecord() { + let mut mock_http_message_service = MockMessageService::new(); + mock_http_message_service + .expect_get_cardano_transaction_message() + .return_once(|_| Ok(None)) + .once(); + let mut dependency_manager = initialize_dependencies().await; + dependency_manager.message_service = Arc::new(mock_http_message_service); + + let method = Method::GET.as_str(); + let path = "/artifact/cardano-transaction/{hash}"; + + let response = request() + .method(method) + .path(&format!("/{SERVER_BASE_PATH}{path}")) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } + + #[tokio::test] + async fn test_cardano_transaction_get_ko() { + let mut mock_http_message_service = MockMessageService::new(); + mock_http_message_service + .expect_get_cardano_transaction_message() + .return_once(|_| Err(HydrationError::InvalidData("invalid data".to_string()).into())) + .once(); + let mut dependency_manager = initialize_dependencies().await; + dependency_manager.message_service = Arc::new(mock_http_message_service); + + let method = Method::GET.as_str(); + let path = "/artifact/cardano-transaction/{hash}"; + + let response = request() + .method(method) + .path(&format!("/{SERVER_BASE_PATH}{path}")) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } +} diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs index d2104b0924d..eaf5be7d26a 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/mithril_stake_distribution.rs @@ -87,6 +87,7 @@ pub mod handlers { #[cfg(test)] pub mod tests { + use crate::http_server::routes::artifact_routes::test_utils::*; use crate::{ http_server::SERVER_BASE_PATH, initialize_dependencies, @@ -95,14 +96,12 @@ pub mod tests { }, services::MockMessageService, }; - use chrono::{DateTime, Utc}; use mithril_common::{ - entities::{Epoch, SignedEntity, SignedEntityType}, + entities::{Epoch, SignedEntityType}, messages::ToMessageAdapter, - signable_builder::Artifact, - sqlite::HydrationError, test_utils::{apispec::APISpec, fake_data}, }; + use mithril_persistence::sqlite::HydrationError; use serde_json::Value::Null; use warp::{http::Method, test::request}; @@ -121,28 +120,6 @@ pub mod tests { .and(routes(dependency_manager).with(cors)) } - pub fn create_signed_entities( - signed_entity_type: SignedEntityType, - records: Vec, - ) -> Vec> - where - T: Artifact, - { - records - .into_iter() - .enumerate() - .map(|(idx, record)| SignedEntity { - signed_entity_id: format!("{idx}"), - signed_entity_type: signed_entity_type.to_owned(), - certificate_id: format!("certificate-{idx}"), - artifact: record, - created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") - .unwrap() - .with_timezone(&Utc), - }) - .collect() - } - #[tokio::test] async fn test_mithril_stake_distributions_get_ok() { let signed_entity_records = create_signed_entities( diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/mod.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/mod.rs index d4be1d40db3..7b2f39673ec 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/mod.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/mod.rs @@ -1,2 +1,32 @@ +pub mod cardano_transaction; pub mod mithril_stake_distribution; pub mod snapshot; + +#[cfg(test)] +pub mod test_utils { + use chrono::{DateTime, Utc}; + use mithril_common::entities::{SignedEntity, SignedEntityType}; + use mithril_common::signable_builder::Artifact; + + pub fn create_signed_entities( + signed_entity_type: SignedEntityType, + records: Vec, + ) -> Vec> + where + T: Artifact, + { + records + .into_iter() + .enumerate() + .map(|(idx, record)| SignedEntity { + signed_entity_id: format!("{idx}"), + signed_entity_type: signed_entity_type.to_owned(), + certificate_id: format!("certificate-{idx}"), + artifact: record, + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + }) + .collect() + } +} diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs index b8510c4bd22..fc320229d4b 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/snapshot.rs @@ -220,20 +220,19 @@ mod handlers { #[cfg(test)] mod tests { + use crate::http_server::routes::artifact_routes::test_utils::*; use crate::{ http_server::SERVER_BASE_PATH, initialize_dependencies, message_adapters::{ToSnapshotListMessageAdapter, ToSnapshotMessageAdapter}, services::{MockMessageService, MockSignedEntityService}, }; - use chrono::{DateTime, Utc}; use mithril_common::{ - entities::{Beacon, SignedEntity, SignedEntityType}, + entities::{Beacon, SignedEntityType}, messages::ToMessageAdapter, - signable_builder::Artifact, - sqlite::HydrationError, test_utils::{apispec::APISpec, fake_data}, }; + use mithril_persistence::sqlite::HydrationError; use serde_json::Value::Null; use warp::{http::Method, test::request}; @@ -252,28 +251,6 @@ mod tests { .and(routes(dependency_manager).with(cors)) } - pub fn create_signed_entities( - signed_entity_type: SignedEntityType, - records: Vec, - ) -> Vec> - where - T: Artifact, - { - records - .into_iter() - .enumerate() - .map(|(idx, record)| SignedEntity { - signed_entity_id: format!("{idx}"), - signed_entity_type: signed_entity_type.to_owned(), - certificate_id: format!("certificate-{idx}"), - artifact: record, - created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") - .unwrap() - .with_timezone(&Utc), - }) - .collect() - } - #[tokio::test] async fn test_snapshots_get_ok() { let signed_entities = create_signed_entities( diff --git a/mithril-aggregator/src/http_server/routes/middlewares.rs b/mithril-aggregator/src/http_server/routes/middlewares.rs index b3d6e5ed4c0..7727e210deb 100644 --- a/mithril-aggregator/src/http_server/routes/middlewares.rs +++ b/mithril-aggregator/src/http_server/routes/middlewares.rs @@ -2,7 +2,9 @@ use crate::{ database::provider::SignerGetter, dependency_injection::EpochServiceWrapper, event_store::{EventMessage, TransmitterService}, - services::{CertifierService, MessageService, SignedEntityService, TickerService}, + services::{ + CertifierService, MessageService, ProverService, SignedEntityService, TickerService, + }, CertificatePendingStore, Configuration, DependencyContainer, SignerRegisterer, VerificationKeyStorer, }; @@ -102,3 +104,10 @@ pub fn with_http_message_service( ) -> impl Filter,), Error = Infallible> + Clone { warp::any().map(move || dependency_manager.message_service.clone()) } + +/// With Prover service +pub fn with_prover_service( + dependency_manager: Arc, +) -> impl Filter,), Error = Infallible> + Clone { + warp::any().map(move || dependency_manager.prover_service.clone()) +} diff --git a/mithril-aggregator/src/http_server/routes/mod.rs b/mithril-aggregator/src/http_server/routes/mod.rs index 42f935091d3..782c1b7147b 100644 --- a/mithril-aggregator/src/http_server/routes/mod.rs +++ b/mithril-aggregator/src/http_server/routes/mod.rs @@ -2,9 +2,27 @@ mod artifact_routes; mod certificate_routes; mod epoch_routes; mod middlewares; +mod proof_routes; pub(crate) mod reply; mod root_routes; pub mod router; mod signatures_routes; mod signer_routes; mod statistics_routes; + +/// Match the given result and do an early return with an internal server error (500) +/// if it was an Error. Else return the unwrapped value. +#[macro_export] +macro_rules! unwrap_to_internal_server_error { + ($code:expr, $($warn_comment:tt)*) => { + match $code { + Ok(res) => res, + Err(err) => { + warn!($($warn_comment)*; "error" => ?err); + return Ok($crate::http_server::routes::reply::internal_server_error( + err, + )); + } + } + }; +} diff --git a/mithril-aggregator/src/http_server/routes/proof_routes.rs b/mithril-aggregator/src/http_server/routes/proof_routes.rs new file mode 100644 index 00000000000..409ce0fa298 --- /dev/null +++ b/mithril-aggregator/src/http_server/routes/proof_routes.rs @@ -0,0 +1,232 @@ +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use warp::Filter; + +use crate::http_server::routes::middlewares; +use crate::DependencyContainer; + +#[derive(Deserialize, Serialize, Debug)] +struct CardanoTransactionProofQueryParams { + transaction_hashes: String, +} + +impl CardanoTransactionProofQueryParams { + pub fn split_transactions_hashes(&self) -> Vec<&str> { + self.transaction_hashes.split(',').collect() + } +} + +pub fn routes( + dependency_manager: Arc, +) -> impl Filter + Clone { + proof_cardano_transaction(dependency_manager) +} + +/// GET /proof/cardano-transaction +fn proof_cardano_transaction( + dependency_manager: Arc, +) -> impl Filter + Clone { + warp::path!("proof" / "cardano-transaction") + .and(warp::get()) + .and(warp::query::()) + .and(middlewares::with_signed_entity_service( + dependency_manager.clone(), + )) + .and(middlewares::with_prover_service(dependency_manager)) + .and_then(handlers::proof_cardano_transaction) +} + +mod handlers { + use reqwest::StatusCode; + use slog_scope::{debug, warn}; + use std::{convert::Infallible, sync::Arc}; + + use crate::{ + http_server::routes::reply, + message_adapters::ToCardanoTransactionsProofsMessageAdapter, + services::{ProverService, SignedEntityService}, + unwrap_to_internal_server_error, + }; + + use super::CardanoTransactionProofQueryParams; + + pub async fn proof_cardano_transaction( + transaction_parameters: CardanoTransactionProofQueryParams, + signed_entity_service: Arc, + prover_service: Arc, + ) -> Result { + let transaction_hashes = transaction_parameters + .split_transactions_hashes() + .iter() + .map(|s| s.to_string()) + .collect::>(); + debug!( + "⇄ HTTP SERVER: proof_cardano_transaction?transaction_hashes={}", + transaction_parameters.transaction_hashes + ); + + match unwrap_to_internal_server_error!( + signed_entity_service + .get_last_cardano_transaction_commitment() + .await, + "proof_cardano_transaction::error" + ) { + Some(signed_entity) => { + let transactions_set_proofs = unwrap_to_internal_server_error!( + prover_service + .compute_transactions_proofs( + &signed_entity.artifact.beacon, + transaction_hashes.as_slice(), + ) + .await, + "proof_cardano_transaction::error" + ); + + let message = unwrap_to_internal_server_error!( + ToCardanoTransactionsProofsMessageAdapter::try_adapt( + &signed_entity.certificate_id, + transactions_set_proofs, + transaction_hashes, + ), + "proof_cardano_transaction::error" + ); + Ok(reply::json(&message, StatusCode::OK)) + } + None => { + warn!("proof_cardano_transaction::not_found"); + Ok(reply::empty(StatusCode::NOT_FOUND)) + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::vec; + + use mithril_common::test_utils::apispec::APISpec; + + use anyhow::anyhow; + use mithril_common::entities::{ + CardanoTransactionsCommitment, CardanoTransactionsSetProof, SignedEntity, + }; + use serde_json::Value::Null; + use warp::{http::Method, test::request}; + + use crate::services::MockSignedEntityService; + use crate::{ + dependency_injection::DependenciesBuilder, http_server::SERVER_BASE_PATH, + services::MockProverService, Configuration, + }; + + fn setup_router( + dependency_manager: Arc, + ) -> impl Filter + Clone { + let cors = warp::cors() + .allow_any_origin() + .allow_headers(vec!["content-type"]) + .allow_methods(vec![Method::GET, Method::POST, Method::OPTIONS]); + + warp::any() + .and(warp::path(SERVER_BASE_PATH)) + .and(routes(dependency_manager).with(cors)) + } + + #[tokio::test] + async fn proof_cardano_transaction_ok() { + let config = Configuration::new_sample(); + let mut builder = DependenciesBuilder::new(config); + let mut dependency_manager = builder.build_dependency_container().await.unwrap(); + let mut mock_signed_entity_service = MockSignedEntityService::new(); + mock_signed_entity_service + .expect_get_last_cardano_transaction_commitment() + .returning(|| Ok(Some(SignedEntity::::dummy()))); + dependency_manager.signed_entity_service = Arc::new(mock_signed_entity_service); + + let mut mock_prover_service = MockProverService::new(); + mock_prover_service + .expect_compute_transactions_proofs() + .returning(|_, _| Ok(vec![CardanoTransactionsSetProof::dummy()])); + dependency_manager.prover_service = Arc::new(mock_prover_service); + + let method = Method::GET.as_str(); + let path = "/proof/cardano-transaction"; + + let response = request() + .method(method) + .path(&format!( + "/{SERVER_BASE_PATH}{path}?transaction_hashes=tx-123,tx-456" + )) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } + + #[tokio::test] + async fn proof_cardano_transaction_not_found() { + let config = Configuration::new_sample(); + let mut builder = DependenciesBuilder::new(config); + let dependency_manager = builder.build_dependency_container().await.unwrap(); + + let method = Method::GET.as_str(); + let path = "/proof/cardano-transaction"; + + let response = request() + .method(method) + .path(&format!( + "/{SERVER_BASE_PATH}{path}?transaction_hashes=tx-123,tx-456" + )) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } + + #[tokio::test] + async fn proof_cardano_transaction_ko() { + let config = Configuration::new_sample(); + let mut builder = DependenciesBuilder::new(config); + let mut dependency_manager = builder.build_dependency_container().await.unwrap(); + let mut mock_signed_entity_service = MockSignedEntityService::new(); + mock_signed_entity_service + .expect_get_last_cardano_transaction_commitment() + .returning(|| Err(anyhow!("Error"))); + dependency_manager.signed_entity_service = Arc::new(mock_signed_entity_service); + + let method = Method::GET.as_str(); + let path = "/proof/cardano-transaction"; + + let response = request() + .method(method) + .path(&format!( + "/{SERVER_BASE_PATH}{path}?transaction_hashes=tx-123,tx-456" + )) + .reply(&setup_router(Arc::new(dependency_manager))) + .await; + + APISpec::verify_conformity( + APISpec::get_all_spec_files(), + method, + path, + "application/json", + &Null, + &response, + ); + } +} diff --git a/mithril-aggregator/src/http_server/routes/router.rs b/mithril-aggregator/src/http_server/routes/router.rs index 4b0ad3869af..d84c3f6a697 100644 --- a/mithril-aggregator/src/http_server/routes/router.rs +++ b/mithril-aggregator/src/http_server/routes/router.rs @@ -15,7 +15,7 @@ use warp::http::Method; use warp::reject::Reject; use warp::{Filter, Rejection, Reply}; -use super::middlewares; +use super::{middlewares, proof_routes}; #[derive(Debug)] pub struct VersionMismatchError; @@ -49,6 +49,10 @@ pub fn routes( .or(artifact_routes::mithril_stake_distribution::routes( dependency_manager.clone(), )) + .or(artifact_routes::cardano_transaction::routes( + dependency_manager.clone(), + )) + .or(proof_routes::routes(dependency_manager.clone())) .or(signer_routes::routes(dependency_manager.clone())) .or(signatures_routes::routes(dependency_manager.clone())) .or(epoch_routes::routes(dependency_manager.clone())) diff --git a/mithril-aggregator/src/http_server/routes/signer_routes.rs b/mithril-aggregator/src/http_server/routes/signer_routes.rs index c386351b603..3f9f988d353 100644 --- a/mithril-aggregator/src/http_server/routes/signer_routes.rs +++ b/mithril-aggregator/src/http_server/routes/signer_routes.rs @@ -249,9 +249,9 @@ mod tests { use mithril_common::{ crypto_helper::ProtocolRegistrationError, messages::RegisterSignerMessage, - store::adapter::AdapterError, test_utils::{apispec::APISpec, fake_data}, }; + use mithril_persistence::store::adapter::AdapterError; use mockall::predicate::eq; use serde_json::Value::Null; use warp::{http::Method, test::request}; diff --git a/mithril-aggregator/src/message_adapters/mod.rs b/mithril-aggregator/src/message_adapters/mod.rs index 90ea9f76473..754055c9d46 100644 --- a/mithril-aggregator/src/message_adapters/mod.rs +++ b/mithril-aggregator/src/message_adapters/mod.rs @@ -1,5 +1,8 @@ mod from_register_signature; mod from_register_signer; +mod to_cardano_transaction_list_message; +mod to_cardano_transaction_message; +mod to_cardano_transactions_proof_message; mod to_certificate_pending_message; mod to_epoch_settings_message; mod to_mithril_stake_distribution_list_message; @@ -9,9 +12,18 @@ mod to_snapshot_message; pub use from_register_signature::FromRegisterSingleSignatureAdapter; pub use from_register_signer::FromRegisterSignerAdapter; +#[cfg(test)] +pub use to_cardano_transaction_list_message::ToCardanoTransactionListMessageAdapter; +#[cfg(test)] +pub use to_cardano_transaction_message::ToCardanoTransactionMessageAdapter; +pub use to_cardano_transactions_proof_message::ToCardanoTransactionsProofsMessageAdapter; pub use to_certificate_pending_message::ToCertificatePendingMessageAdapter; pub use to_epoch_settings_message::ToEpochSettingsMessageAdapter; +#[cfg(test)] pub use to_mithril_stake_distribution_list_message::ToMithrilStakeDistributionListMessageAdapter; +#[cfg(test)] pub use to_mithril_stake_distribution_message::ToMithrilStakeDistributionMessageAdapter; +#[cfg(test)] pub use to_snapshot_list_message::ToSnapshotListMessageAdapter; +#[cfg(test)] pub use to_snapshot_message::ToSnapshotMessageAdapter; diff --git a/mithril-aggregator/src/message_adapters/to_cardano_transaction_list_message.rs b/mithril-aggregator/src/message_adapters/to_cardano_transaction_list_message.rs new file mode 100644 index 00000000000..f4e2f3e98e1 --- /dev/null +++ b/mithril-aggregator/src/message_adapters/to_cardano_transaction_list_message.rs @@ -0,0 +1,57 @@ +use mithril_common::entities::{CardanoTransactionsCommitment, SignedEntity}; +use mithril_common::messages::{ + CardanoTransactionCommitmentListItemMessage, CardanoTransactionCommitmentListMessage, + ToMessageAdapter, +}; + +/// Adapter to convert a list of [CardanoTransaction] to [CardanoTransactionCommitmentListMessage] instances +pub struct ToCardanoTransactionListMessageAdapter; + +impl + ToMessageAdapter< + Vec>, + CardanoTransactionCommitmentListMessage, + > for ToCardanoTransactionListMessageAdapter +{ + /// Method to trigger the conversion + fn adapt( + snapshots: Vec>, + ) -> CardanoTransactionCommitmentListMessage { + snapshots + .into_iter() + .map(|entity| CardanoTransactionCommitmentListItemMessage { + merkle_root: entity.artifact.merkle_root.clone(), + beacon: entity.artifact.beacon.clone(), + hash: entity.artifact.hash, + certificate_hash: entity.certificate_id, + created_at: entity.created_at, + }) + .collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn adapt_ok() { + let signed_entity = SignedEntity::::dummy(); + let mithril_stake_distribution_list_message_expected = + vec![CardanoTransactionCommitmentListItemMessage { + merkle_root: signed_entity.artifact.merkle_root.clone(), + beacon: signed_entity.artifact.beacon.clone(), + hash: signed_entity.artifact.hash.clone(), + certificate_hash: signed_entity.certificate_id.clone(), + created_at: signed_entity.created_at, + }]; + + let mithril_stake_distribution_list_message = + ToCardanoTransactionListMessageAdapter::adapt(vec![signed_entity]); + + assert_eq!( + mithril_stake_distribution_list_message_expected, + mithril_stake_distribution_list_message + ); + } +} diff --git a/mithril-aggregator/src/message_adapters/to_cardano_transaction_message.rs b/mithril-aggregator/src/message_adapters/to_cardano_transaction_message.rs new file mode 100644 index 00000000000..7e0685dffa3 --- /dev/null +++ b/mithril-aggregator/src/message_adapters/to_cardano_transaction_message.rs @@ -0,0 +1,50 @@ +use mithril_common::entities::{CardanoTransactionsCommitment, SignedEntity}; +use mithril_common::messages::{CardanoTransactionCommitmentMessage, ToMessageAdapter}; + +/// Adapter to convert [CardanoTransaction] to [CardanoTransactionCommitmentMessage] instances +pub struct ToCardanoTransactionMessageAdapter; + +impl + ToMessageAdapter< + SignedEntity, + CardanoTransactionCommitmentMessage, + > for ToCardanoTransactionMessageAdapter +{ + /// Method to trigger the conversion + fn adapt( + from: SignedEntity, + ) -> CardanoTransactionCommitmentMessage { + CardanoTransactionCommitmentMessage { + merkle_root: from.artifact.merkle_root.clone(), + beacon: from.artifact.beacon, + hash: from.artifact.hash, + certificate_hash: from.certificate_id, + created_at: from.created_at, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn adapt_ok() { + let signed_entity = SignedEntity::::dummy(); + let cardano_stake_distribution_message_expected = CardanoTransactionCommitmentMessage { + merkle_root: signed_entity.artifact.merkle_root.clone(), + beacon: signed_entity.artifact.beacon.clone(), + hash: signed_entity.artifact.hash.clone(), + certificate_hash: signed_entity.certificate_id.clone(), + created_at: signed_entity.created_at, + }; + + let cardano_stake_distribution_message = + ToCardanoTransactionMessageAdapter::adapt(signed_entity); + + assert_eq!( + cardano_stake_distribution_message_expected, + cardano_stake_distribution_message + ); + } +} diff --git a/mithril-aggregator/src/message_adapters/to_cardano_transactions_proof_message.rs b/mithril-aggregator/src/message_adapters/to_cardano_transactions_proof_message.rs new file mode 100644 index 00000000000..1d5a99947d0 --- /dev/null +++ b/mithril-aggregator/src/message_adapters/to_cardano_transactions_proof_message.rs @@ -0,0 +1,106 @@ +use mithril_common::messages::CardanoTransactionsSetProofMessagePart; +use mithril_common::{ + entities::{CardanoTransactionsSetProof, TransactionHash}, + messages::CardanoTransactionsProofsMessage, + StdResult, +}; + +/// Adapter to spawn [CardanoTransactionsProofsMessage] from [CardanoTransactionsProofs] instances. +pub struct ToCardanoTransactionsProofsMessageAdapter; + +impl ToCardanoTransactionsProofsMessageAdapter { + /// Turn an entity instance into message. + pub fn try_adapt( + certificate_hash: &str, + transactions_set_proofs: Vec, + transaction_hashes_to_certify: Vec, + ) -> StdResult { + let transactions_hashes_not_certified = compute_not_certified_transactions( + &transactions_set_proofs, + &transaction_hashes_to_certify, + ); + + Ok(CardanoTransactionsProofsMessage::new( + certificate_hash, + try_adapt_set_proof_message(transactions_set_proofs)?, + transactions_hashes_not_certified, + )) + } +} + +fn compute_not_certified_transactions( + transactions_set_proofs: &[CardanoTransactionsSetProof], + transaction_hashes_to_certify: &[TransactionHash], +) -> Vec { + let transactions_hashes_certified = transactions_set_proofs + .iter() + .flat_map(|proof| proof.transactions_hashes().to_vec()) + .collect::>(); + + transaction_hashes_to_certify + .iter() + .filter(|hash| !transactions_hashes_certified.contains(hash)) + .cloned() + .collect() +} + +fn try_adapt_set_proof_message( + transactions_set_proofs: Vec, +) -> StdResult> { + let mut messages = vec![]; + + for set_proof in transactions_set_proofs { + messages.push(set_proof.try_into()?); + } + + Ok(messages) +} + +#[cfg(test)] +mod tests { + use mithril_common::crypto_helper::MKProof; + + use super::*; + + #[test] + fn test_simple_message() { + let transaction_hashes = &[ + "tx-1".to_string(), + "tx-2".to_string(), + "tx-3".to_string(), + "tx-4".to_string(), + "tx-5".to_string(), + "tx-6".to_string(), + "tx-7".to_string(), + ]; + let transactions_hashes_certified = &transaction_hashes[0..5]; + let transactions_hashes_non_certified = &transaction_hashes[5..]; + + let mut transactions_set_proofs = Vec::new(); + for transaction_hashes_in_chunk in transactions_hashes_certified.chunks(2) { + let mk_proof = MKProof::from_leaves(transaction_hashes_in_chunk).unwrap(); + transactions_set_proofs.push(CardanoTransactionsSetProof::new( + transaction_hashes_in_chunk.to_vec(), + mk_proof, + )) + } + + let certificate_hash = "certificate_hash"; + let message = ToCardanoTransactionsProofsMessageAdapter::try_adapt( + certificate_hash, + transactions_set_proofs.clone(), + transaction_hashes.to_vec(), + ) + .unwrap(); + let transactions_set_proofs = transactions_set_proofs + .into_iter() + .map(|p| p.try_into().unwrap()) + .collect(); + let expected_message = CardanoTransactionsProofsMessage::new( + certificate_hash, + transactions_set_proofs, + transactions_hashes_non_certified.to_vec(), + ); + assert_eq!(expected_message, message); + } +} diff --git a/mithril-aggregator/src/runtime/runner.rs b/mithril-aggregator/src/runtime/runner.rs index 41312b3595d..4e1594ed342 100644 --- a/mithril-aggregator/src/runtime/runner.rs +++ b/mithril-aggregator/src/runtime/runner.rs @@ -1,14 +1,15 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; -use slog_scope::{debug, info, warn}; +use slog_scope::{debug, warn}; +use std::str::FromStr; use std::{path::Path, path::PathBuf, sync::Arc}; use mithril_common::entities::{ Beacon, Certificate, CertificatePending, Epoch, ProtocolMessage, ProtocolMessagePartKey, - SignedEntityType, Signer, + SignedEntityType, SignedEntityTypeDiscriminants, Signer, }; -use mithril_common::store::StakeStorer; use mithril_common::{CardanoNetwork, StdResult}; +use mithril_persistence::store::StakeStorer; use crate::entities::OpenMessage; use crate::DependencyContainer; @@ -47,8 +48,8 @@ pub trait AggregatorRunnerTrait: Sync + Send { /// Return the current beacon from the chain async fn get_beacon_from_chain(&self) -> StdResult; - /// Retrieves the current non certified open message for a given signed entity type. - async fn get_current_non_certified_open_message_for_signed_entity_type( + /// Retrieves the current open message for a given signed entity type. + async fn get_current_open_message_for_signed_entity_type( &self, signed_entity_type: &SignedEntityType, ) -> StdResult>; @@ -80,6 +81,12 @@ pub trait AggregatorRunnerTrait: Sync + Send { signed_entity_type: &SignedEntityType, ) -> StdResult; + /// Mark expired open message. + async fn mark_open_message_if_expired( + &self, + signed_entity_type: &SignedEntityType, + ) -> StdResult>; + /// Create a new pending certificate. async fn create_new_pending_certificate( &self, @@ -137,6 +144,42 @@ impl AggregatorRunner { pub fn new(dependencies: Arc) -> Self { Self { dependencies } } + + /// Create the deduplicated list of allowed signed entity types. + /// By default, the list contains the MithrilStakeDistribution and the CardanoImmutableFilesFull. + /// The list can be extended with the configuration parameter `signed_entity_types`. + /// The configuration parameter is a comma separated list of signed entity types. + /// The signed entity types are defined in the [SignedEntityTypeDiscriminants] enum. + /// The signed entity types are discarded if they are not declared in the [SignedEntityType] enum. + fn list_allowed_signed_entity_types( + &self, + beacon: &Beacon, + ) -> StdResult> { + let mut signed_entity_types = Vec::new(); + signed_entity_types.push(SignedEntityType::MithrilStakeDistribution(beacon.epoch)); + signed_entity_types.push(SignedEntityType::CardanoImmutableFilesFull( + beacon.to_owned(), + )); + + let discriminant_names = self + .dependencies + .config + .signed_entity_types + .clone() + .unwrap_or_default(); + let mut signed_entity_types_appended = discriminant_names + .split(',') + .filter_map(|name| { + SignedEntityTypeDiscriminants::from_str(name.trim()) + .ok() + .map(|discriminant| SignedEntityType::from_beacon(&discriminant, beacon)) + }) + .filter(|signed_entity_type| !signed_entity_types.contains(signed_entity_type)) + .collect::>(); + signed_entity_types.append(&mut signed_entity_types_appended); + + Ok(signed_entity_types) + } } #[cfg_attr(test, automock)] @@ -154,50 +197,20 @@ impl AggregatorRunnerTrait for AggregatorRunner { Ok(beacon) } - async fn get_current_non_certified_open_message_for_signed_entity_type( + async fn get_current_open_message_for_signed_entity_type( &self, signed_entity_type: &SignedEntityType, ) -> StdResult> { - debug!("RUNNER: get_current_non_certified_open_message_for_signed_entity_type"; "signed_entity_type" => ?signed_entity_type); - let open_message_maybe = match self + debug!("RUNNER: get_current_open_message_for_signed_entity_type"; "signed_entity_type" => ?signed_entity_type); + self.mark_open_message_if_expired(signed_entity_type) + .await?; + + Ok(self .dependencies .certifier_service .get_open_message(signed_entity_type) .await - .with_context(|| format!("CertifierService can not get open message for signed_entity_type: '{signed_entity_type}'"))? - { - Some(existing_open_message) if !existing_open_message.is_certified => { - info!( - "RUNNER: get_current_non_certified_open_message_for_signed_entity_type: existing open message found, not already certified"; - "signed_entity_type" => ?signed_entity_type - ); - - Some(existing_open_message) - } - Some(_) => { - info!( - "RUNNER: get_current_non_certified_open_message_for_signed_entity_type: existing open message found, already certified"; - "signed_entity_type" => ?signed_entity_type - ); - - None - } - None => { - info!( - "RUNNER: get_current_non_certified_open_message_for_signed_entity_type: no open message found, a new one will be created"; - "signed_entity_type" => ?signed_entity_type - ); - let protocol_message = self.compute_protocol_message(signed_entity_type).await.with_context(|| format!("AggregatorRunner can not compute protocol message for signed_entity_type: '{signed_entity_type}'"))?; - - Some( - self.create_open_message(signed_entity_type, &protocol_message) - .await - .with_context(|| format!("AggregatorRunner can not create open message for signed_entity_type: '{signed_entity_type}'"))?, - ) - } - }; - - Ok(open_message_maybe) + .with_context(|| format!("CertifierService can not get open message for signed_entity_type: '{signed_entity_type}'"))?) } async fn get_current_non_certified_open_message( @@ -205,23 +218,30 @@ impl AggregatorRunnerTrait for AggregatorRunner { current_beacon: &Beacon, ) -> StdResult> { debug!("RUNNER: get_current_non_certified_open_message"; "beacon" => #?current_beacon); - let signed_entity_types = vec![ - SignedEntityType::MithrilStakeDistribution(current_beacon.epoch), - SignedEntityType::CardanoImmutableFilesFull(current_beacon.clone()), - ]; - + let signed_entity_types = self + .list_allowed_signed_entity_types(current_beacon) + .with_context(|| { + "AggregatorRunner can not create the list of allowed signed entity types" + })?; for signed_entity_type in signed_entity_types { if let Some(open_message) = self - .get_current_non_certified_open_message_for_signed_entity_type(&signed_entity_type) + .get_current_open_message_for_signed_entity_type(&signed_entity_type) .await - .with_context(|| format!("AggregatorRunner can not get current non certified open message for signed entity type: '{}'", &signed_entity_type))? + .with_context(|| format!("AggregatorRunner can not get current open message for signed entity type: '{}'", &signed_entity_type))? { - return Ok(Some(open_message)); + if !open_message.is_certified { + return Ok(Some(open_message)); + } + if open_message.is_certified || open_message.is_expired { + continue; + } } - info!( - "RUNNER: get_current_non_certified_open_message: open message already certified"; - "signed_entity_type" => ?signed_entity_type - ); + let protocol_message = self.compute_protocol_message(&signed_entity_type).await.with_context(|| format!("AggregatorRunner can not compute protocol message for signed_entity_type: '{signed_entity_type}'"))?; + let open_message_new = self.create_open_message(&signed_entity_type, &protocol_message) + .await + .with_context(|| format!("AggregatorRunner can not create open message for signed_entity_type: '{signed_entity_type}'"))?; + + return Ok(Some(open_message_new)); } Ok(None) @@ -305,6 +325,27 @@ impl AggregatorRunnerTrait for AggregatorRunner { Ok(protocol_message) } + async fn mark_open_message_if_expired( + &self, + signed_entity_type: &SignedEntityType, + ) -> StdResult> { + debug!("RUNNER: mark expired open message"); + + let expired_open_message = self + .dependencies + .certifier_service + .mark_open_message_if_expired(signed_entity_type) + .await + .with_context(|| "CertifierService can not mark expired open message")?; + + debug!( + "RUNNER: marked expired open messages: {:#?}", + expired_open_message + ); + + Ok(expired_open_message) + } + async fn create_new_pending_certificate( &self, beacon: Beacon, @@ -484,6 +525,7 @@ pub mod tests { DependencyContainer, MithrilSignerRegisterer, SignerRegistrationRound, }; use async_trait::async_trait; + use chrono::{DateTime, Utc}; use mithril_common::{ chain_observer::FakeObserver, digesters::DumbImmutableFileObserver, @@ -492,10 +534,10 @@ pub mod tests { StakeDistribution, }, signable_builder::SignableBuilderService, - store::StakeStorer, test_utils::{fake_data, MithrilFixtureBuilder}, BeaconProviderImpl, CardanoNetwork, StdResult, }; + use mithril_persistence::store::StakeStorer; use mockall::{mock, predicate::eq}; use std::sync::Arc; use tokio::sync::RwLock; @@ -535,6 +577,44 @@ pub mod tests { AggregatorRunner::new(Arc::new(deps)) } + #[tokio::test] + async fn test_list_allowed_signed_entity_types_without_specific_configuration() { + let mut deps = initialize_dependencies().await; + deps.config.signed_entity_types = None; + let deps = Arc::new(deps); + let runner = AggregatorRunner::new(deps.clone()); + let beacon = fake_data::beacon(); + + let signed_entity_types = runner.list_allowed_signed_entity_types(&beacon).unwrap(); + + let expected = vec![ + SignedEntityType::MithrilStakeDistribution(beacon.epoch), + SignedEntityType::CardanoImmutableFilesFull(beacon.clone()), + ]; + + assert_eq!(expected, signed_entity_types); + } + + #[tokio::test] + async fn test_list_allowed_signed_entity_types_with_specific_configuration() { + let mut deps = initialize_dependencies().await; + deps.config.signed_entity_types = + Some("MithrilStakeDistribution,Unknown, CardanoStakeDistribution".to_string()); + let deps = Arc::new(deps); + let runner = AggregatorRunner::new(deps.clone()); + let beacon = fake_data::beacon(); + + let signed_entity_types = runner.list_allowed_signed_entity_types(&beacon).unwrap(); + + let expected = vec![ + SignedEntityType::MithrilStakeDistribution(beacon.epoch), + SignedEntityType::CardanoImmutableFilesFull(beacon.clone()), + SignedEntityType::CardanoStakeDistribution(beacon.epoch), + ]; + + assert_eq!(expected, signed_entity_types); + } + #[tokio::test] async fn test_get_beacon_from_chain() { let expected_beacon = Beacon::new("private".to_string(), 2, 17); @@ -662,6 +742,40 @@ pub mod tests { assert!(saved_current_round.is_none()); } + #[tokio::test] + async fn test_expire_open_message() { + let pending_certificate = fake_data::certificate_pending(); + + let open_message_expected = OpenMessage { + signed_entity_type: pending_certificate.signed_entity_type.clone(), + is_certified: false, + is_expired: false, + expires_at: Some( + DateTime::parse_from_rfc3339("2000-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + ), + ..OpenMessage::dummy() + }; + let open_message_clone = open_message_expected.clone(); + + let mut mock_certifier_service = MockCertifierService::new(); + mock_certifier_service + .expect_mark_open_message_if_expired() + .return_once(|_| Ok(Some(open_message_clone))); + + let mut deps = initialize_dependencies().await; + deps.certifier_service = Arc::new(mock_certifier_service); + + let runner = build_runner_with_fixture_data(deps).await; + let open_message_expired = runner + .mark_open_message_if_expired(&open_message_expected.signed_entity_type) + .await + .expect("mark_open_message_if_expired should not fail"); + + assert_eq!(Some(open_message_expected), open_message_expired); + } + #[tokio::test] async fn test_create_new_pending_certificate() { let deps = initialize_dependencies().await; @@ -863,6 +977,10 @@ pub mod tests { .expect_create_open_message() .return_once(|_, _| Ok(open_message_clone)) .times(1); + mock_certifier_service + .expect_mark_open_message_if_expired() + .return_once(|_| Ok(None)) + .times(1); let mut deps = initialize_dependencies().await; deps.certifier_service = Arc::new(mock_certifier_service); @@ -885,12 +1003,13 @@ pub mod tests { } #[tokio::test] - async fn test_get_current_non_certified_open_message_should_return_existing_open_message_for_mithril_stake_distribution_if_already_exists( + async fn test_get_current_non_certified_open_message_should_return_existing_open_message_for_mithril_stake_distribution_if_already_exists_and_not_expired( ) { let beacon = fake_data::beacon(); let open_message_expected = OpenMessage { signed_entity_type: SignedEntityType::MithrilStakeDistribution(beacon.epoch), is_certified: false, + is_expired: false, ..OpenMessage::dummy() }; let open_message_clone = open_message_expected.clone(); @@ -900,6 +1019,10 @@ pub mod tests { .expect_get_open_message() .return_once(|_| Ok(Some(open_message_clone))) .times(1); + mock_certifier_service + .expect_mark_open_message_if_expired() + .return_once(|_| Ok(None)) + .times(1); mock_certifier_service.expect_create_open_message().never(); let mut deps = initialize_dependencies().await; @@ -921,11 +1044,13 @@ pub mod tests { let open_message_already_certified = OpenMessage { signed_entity_type: SignedEntityType::MithrilStakeDistribution(beacon.epoch), is_certified: true, + is_expired: false, ..OpenMessage::dummy() }; let open_message_expected = OpenMessage { signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(fake_data::beacon()), is_certified: false, + is_expired: false, ..OpenMessage::dummy() }; let open_message_clone = open_message_expected.clone(); @@ -939,6 +1064,10 @@ pub mod tests { .expect_get_open_message() .return_once(|_| Ok(Some(open_message_clone))) .times(1); + mock_certifier_service + .expect_mark_open_message_if_expired() + .returning(|_| Ok(None)) + .times(2); mock_certifier_service.expect_create_open_message().never(); let mut deps = initialize_dependencies().await; @@ -960,11 +1089,13 @@ pub mod tests { let open_message_already_certified = OpenMessage { signed_entity_type: SignedEntityType::MithrilStakeDistribution(beacon.epoch), is_certified: true, + is_expired: false, ..OpenMessage::dummy() }; let open_message_expected = OpenMessage { signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(fake_data::beacon()), is_certified: false, + is_expired: false, ..OpenMessage::dummy() }; let open_message_clone = open_message_expected.clone(); @@ -988,6 +1119,10 @@ pub mod tests { .expect_create_open_message() .return_once(|_, _| Ok(open_message_clone)) .times(1); + mock_certifier_service + .expect_mark_open_message_if_expired() + .returning(|_| Ok(None)) + .times(2); let mut mock_signable_builder_service = MockSignableBuilderServiceImpl::new(); mock_signable_builder_service @@ -1022,11 +1157,13 @@ pub mod tests { let open_message_already_certified_mithril_stake_distribution = OpenMessage { signed_entity_type: SignedEntityType::MithrilStakeDistribution(beacon.epoch), is_certified: true, + is_expired: false, ..OpenMessage::dummy() }; let open_message_already_certified_cardano_immutable_files = OpenMessage { signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(fake_data::beacon()), is_certified: true, + is_expired: false, ..OpenMessage::dummy() }; @@ -1043,6 +1180,10 @@ pub mod tests { .expect_get_open_message() .return_once(|_| Ok(Some(open_message_already_certified_cardano_immutable_files))) .times(1); + mock_certifier_service + .expect_mark_open_message_if_expired() + .returning(|_| Ok(None)) + .times(2); mock_certifier_service.expect_create_open_message().never(); let mut deps = initialize_dependencies().await; @@ -1056,4 +1197,39 @@ pub mod tests { .unwrap(); assert!(open_message_returned.is_none()); } + + #[tokio::test] + async fn test_get_current_non_certified_open_message_should_return_existing_open_message_if_all_open_message_already_expired( + ) { + let beacon = fake_data::beacon(); + let open_message_expired_cardano_immutable_files = OpenMessage { + signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(fake_data::beacon()), + is_certified: false, + is_expired: true, + ..OpenMessage::dummy() + }; + let open_message_expected = open_message_expired_cardano_immutable_files.clone(); + + let mut mock_certifier_service = MockCertifierService::new(); + mock_certifier_service + .expect_get_open_message() + .return_once(|_| Ok(Some(open_message_expired_cardano_immutable_files))) + .times(1); + mock_certifier_service + .expect_mark_open_message_if_expired() + .return_once(|_| Ok(None)) + .times(1); + mock_certifier_service.expect_create_open_message().never(); + + let mut deps = initialize_dependencies().await; + deps.certifier_service = Arc::new(mock_certifier_service); + + let runner = build_runner_with_fixture_data(deps).await; + + let open_message_returned = runner + .get_current_non_certified_open_message(&beacon) + .await + .unwrap(); + assert_eq!(Some(open_message_expected), open_message_returned); + } } diff --git a/mithril-aggregator/src/runtime/state_machine.rs b/mithril-aggregator/src/runtime/state_machine.rs index bde2922cebd..a7557ff0465 100644 --- a/mithril-aggregator/src/runtime/state_machine.rs +++ b/mithril-aggregator/src/runtime/state_machine.rs @@ -4,7 +4,7 @@ use crate::{ }; use anyhow::Context; -use mithril_common::entities::Beacon; +use mithril_common::entities::{Beacon, SignedEntityType}; use slog_scope::{crit, info, trace, warn}; use std::fmt::Display; use std::sync::Arc; @@ -200,7 +200,7 @@ impl AggregatorRuntime { } else if let Some(open_message) = self .runner .get_current_non_certified_open_message(&chain_beacon) - .await.with_context(|| "AggregatorRuntime can not get the current non certified open message")? + .await.with_context(|| "AggregatorRuntime can not get the current open message")? { // transition READY > SIGNING info!("→ transitioning to SIGNING"); @@ -224,17 +224,23 @@ impl AggregatorRuntime { self.runner.get_beacon_from_chain().await.with_context(|| { "AggregatorRuntime in the state SIGNING can not get current beacon from chain" })?; - let has_newer_open_message = if let Some(open_message_new) = self + let current_open_message = self .runner - .get_current_non_certified_open_message_for_signed_entity_type( + .get_current_open_message_for_signed_entity_type( &state.open_message.signed_entity_type, ) .await - .with_context(|| format!("AggregatorRuntime can not get the current non certified open message for signed entity type: '{}'", &state.open_message.signed_entity_type))? - { - open_message_new.signed_entity_type != state.open_message.signed_entity_type - } else { - false + .with_context(|| format!("AggregatorRuntime can not get the current open message for signed entity type: '{}'", &state.open_message.signed_entity_type))?; + let is_expired_open_message = current_open_message + .as_ref() + .map(|om| om.is_expired) + .unwrap_or(false); + let exists_newer_open_message = { + let new_signed_entity_type = SignedEntityType::from_beacon( + &state.open_message.signed_entity_type.clone().into(), + &chain_beacon, + ); + new_signed_entity_type != state.open_message.signed_entity_type }; if state.current_beacon.epoch < chain_beacon.epoch { @@ -242,7 +248,7 @@ impl AggregatorRuntime { info!("→ Epoch changed, transitioning to IDLE"); let new_state = self.transition_from_signing_to_idle(state).await?; self.state = AggregatorState::Idle(new_state); - } else if has_newer_open_message { + } else if exists_newer_open_message || is_expired_open_message { // SIGNING > READY info!("→ Open message changed, transitioning to READY"); let new_state = self @@ -254,7 +260,7 @@ impl AggregatorRuntime { let new_state = self .transition_from_signing_to_ready_multisignature(state) .await?; - info!("→ a multi-signature have been created, build a snapshot & a certificate and transitioning back to READY"); + info!("→ a multi-signature have been created, build an artifact & a certificate and transitioning back to READY"); self.state = AggregatorState::Ready(new_state); } } @@ -631,7 +637,7 @@ mod tests { .once() .returning(|| Ok(fake_data::beacon())); runner - .expect_get_current_non_certified_open_message_for_signed_entity_type() + .expect_get_current_open_message_for_signed_entity_type() .once() .returning(|_| { Ok(Some(OpenMessage { @@ -665,7 +671,7 @@ mod tests { .once() .returning(|| Ok(fake_data::beacon())); runner - .expect_get_current_non_certified_open_message_for_signed_entity_type() + .expect_get_current_open_message_for_signed_entity_type() .once() .returning(|_| Ok(Some(OpenMessage::dummy()))); runner @@ -701,7 +707,7 @@ mod tests { .once() .returning(|| Ok(fake_data::beacon())); runner - .expect_get_current_non_certified_open_message_for_signed_entity_type() + .expect_get_current_open_message_for_signed_entity_type() .once() .returning(|_| Ok(Some(OpenMessage::dummy()))); runner @@ -744,7 +750,7 @@ mod tests { .once() .returning(|| Ok(fake_data::beacon())); runner - .expect_get_current_non_certified_open_message_for_signed_entity_type() + .expect_get_current_open_message_for_signed_entity_type() .once() .returning(|_| Ok(Some(OpenMessage::dummy()))); runner diff --git a/mithril-aggregator/src/services/certifier.rs b/mithril-aggregator/src/services/certifier.rs index 4df7d09c9e9..90435ef5dc4 100644 --- a/mithril-aggregator/src/services/certifier.rs +++ b/mithril-aggregator/src/services/certifier.rs @@ -50,6 +50,11 @@ pub enum CertifierServiceError { #[error("Open message for beacon {0:?} already certified.")] AlreadyCertified(SignedEntityType), + /// The open message is expired, no more single signatures may be + /// attached to it nor be certified again. + #[error("Open message for beacon {0:?} is expired.")] + Expired(SignedEntityType), + /// No parent certificate could be found, this certifier cannot create genesis certificates. #[error( "No parent certificate could be found, this certifier cannot create genesis certificates." @@ -109,6 +114,12 @@ pub trait CertifierService: Sync + Send { signed_entity_type: &SignedEntityType, ) -> StdResult>; + /// Mark the open message if it has expired. + async fn mark_open_message_if_expired( + &self, + signed_entity_type: &SignedEntityType, + ) -> StdResult>; + /// Create a certificate if possible. If the pointed open message does /// not exist or has been already certified, an error is raised. If a multi /// signature is created then the flag `is_certified` of the open @@ -231,6 +242,12 @@ impl CertifierService for MithrilCertifierService { return Err(CertifierServiceError::AlreadyCertified(signed_entity_type.clone()).into()); } + if open_message.is_expired { + warn!("CertifierService::register_single_signature: open message {signed_entity_type:?} has expired, cannot register single signature."); + + return Err(CertifierServiceError::Expired(signed_entity_type.clone()).into()); + } + let multi_signer = self.multi_signer.read().await; multi_signer .verify_single_signature(&open_message.protocol_message, signature) @@ -292,6 +309,28 @@ impl CertifierService for MithrilCertifierService { Ok(open_message) } + async fn mark_open_message_if_expired( + &self, + signed_entity_type: &SignedEntityType, + ) -> StdResult> { + debug!("CertifierService::mark_open_message_if_expired"); + + let mut open_message_record = self + .open_message_repository + .get_expired_open_message(signed_entity_type) + .await + .with_context(|| "Certifier can not get expired open messages")?; + if let Some(open_message_record) = open_message_record.as_mut() { + open_message_record.is_expired = true; + self.open_message_repository + .update_open_message(open_message_record) + .await + .with_context(|| "Certifier can not update open message to mark it as expired")?; + } + + Ok(open_message_record.map(|record| record.into())) + } + async fn create_certificate( &self, signed_entity_type: &SignedEntityType, @@ -312,6 +351,12 @@ impl CertifierService for MithrilCertifierService { return Err(CertifierServiceError::AlreadyCertified(signed_entity_type.clone()).into()); } + if open_message.is_expired { + warn!("CertifierService::create_certificate: open message {signed_entity_type:?} is expired, cannot create certificate."); + + return Err(CertifierServiceError::Expired(signed_entity_type.clone()).into()); + } + let multi_signer = self.multi_signer.read().await; let multi_signature = match multi_signer.create_multi_signature(&open_message).await? { None => { @@ -352,6 +397,7 @@ impl CertifierService for MithrilCertifierService { } } SignedEntityType::CardanoImmutableFilesFull(beacon) => beacon.clone(), + SignedEntityType::CardanoTransactions(beacon) => beacon.clone(), }; let metadata = CertificateMetadata::new( protocol_version, @@ -458,6 +504,7 @@ mod tests { dependency_injection::DependenciesBuilder, multi_signer::MockMultiSigner, services::FakeEpochService, Configuration, }; + use chrono::{DateTime, Days}; use mithril_common::{ entities::{Beacon, ProtocolMessagePartKey}, test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}, @@ -540,6 +587,92 @@ mod tests { assert!(open_message.is_none()); } + #[tokio::test] + async fn should_mark_open_message_expired_when_exists() { + let beacon = Beacon::new("devnet".to_string(), 3, 1); + let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(beacon.clone()); + let protocol_message = ProtocolMessage::new(); + let epochs_with_signers = (1..=5).map(Epoch).collect::>(); + let fixture = MithrilFixtureBuilder::default().with_signers(1).build(); + let certifier_service = setup_certifier_service(&fixture, &epochs_with_signers, None).await; + let mut open_message = certifier_service + .open_message_repository + .create_open_message(beacon.epoch, &signed_entity_type, &protocol_message) + .await + .unwrap(); + open_message.expires_at = Some( + DateTime::parse_from_rfc3339("2000-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + ); + certifier_service + .open_message_repository + .update_open_message(&open_message) + .await + .unwrap(); + + let open_message = certifier_service + .mark_open_message_if_expired(&signed_entity_type) + .await + .expect("mark_open_message_if_expired should not fail"); + assert!(open_message.is_some()); + assert!(open_message.unwrap().is_expired); + } + + #[tokio::test] + async fn should_not_mark_open_message_expired_when_does_not_expire() { + let beacon = Beacon::new("devnet".to_string(), 3, 1); + let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(beacon.clone()); + let protocol_message = ProtocolMessage::new(); + let epochs_with_signers = (1..=5).map(Epoch).collect::>(); + let fixture = MithrilFixtureBuilder::default().with_signers(1).build(); + let certifier_service = setup_certifier_service(&fixture, &epochs_with_signers, None).await; + let mut open_message = certifier_service + .open_message_repository + .create_open_message(beacon.epoch, &signed_entity_type, &protocol_message) + .await + .unwrap(); + open_message.expires_at = None; + certifier_service + .open_message_repository + .update_open_message(&open_message) + .await + .unwrap(); + + let open_message = certifier_service + .mark_open_message_if_expired(&signed_entity_type) + .await + .expect("mark_open_message_if_expired should not fail"); + assert!(open_message.is_none()); + } + + #[tokio::test] + async fn should_not_mark_open_message_expired_when_has_not_expired_yet() { + let beacon = Beacon::new("devnet".to_string(), 3, 1); + let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(beacon.clone()); + let protocol_message = ProtocolMessage::new(); + let epochs_with_signers = (1..=5).map(Epoch).collect::>(); + let fixture = MithrilFixtureBuilder::default().with_signers(1).build(); + let certifier_service = setup_certifier_service(&fixture, &epochs_with_signers, None).await; + let mut open_message = certifier_service + .open_message_repository + .create_open_message(beacon.epoch, &signed_entity_type, &protocol_message) + .await + .unwrap(); + open_message.expires_at = Some(Utc::now().checked_add_days(Days::new(1)).unwrap()); + certifier_service + .open_message_repository + .update_open_message(&open_message) + .await + .unwrap(); + + let open_message = certifier_service + .mark_open_message_if_expired(&signed_entity_type) + .await + .expect("mark_open_message_if_expired should not fail"); + assert!(open_message.is_none()); + } + #[tokio::test] async fn should_register_valid_single_signature() { let beacon = Beacon::new("devnet".to_string(), 3, 1); @@ -637,6 +770,38 @@ mod tests { .expect_err("register_single_signature should fail"); } + #[tokio::test] + async fn should_not_register_single_signature_for_expired_open_message() { + let beacon = Beacon::new("devnet".to_string(), 3, 1); + let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(beacon.clone()); + let protocol_message = ProtocolMessage::new(); + let epochs_with_signers = (1..=5).map(Epoch).collect::>(); + let fixture = MithrilFixtureBuilder::default().with_signers(1).build(); + let certifier_service = setup_certifier_service(&fixture, &epochs_with_signers, None).await; + let mut open_message = certifier_service + .open_message_repository + .create_open_message(beacon.epoch, &signed_entity_type, &protocol_message) + .await + .unwrap(); + open_message.is_expired = true; + certifier_service + .open_message_repository + .update_open_message(&open_message) + .await + .unwrap(); + + let mut signatures = Vec::new(); + for signer_fixture in fixture.signers_fixture() { + if let Some(signature) = signer_fixture.sign(&protocol_message) { + signatures.push(signature); + } + } + certifier_service + .register_single_signature(&signed_entity_type, &signatures[0]) + .await + .expect_err("register_single_signature should fail"); + } + #[tokio::test] async fn should_create_certificate_when_multi_signature_produced() { let beacon = Beacon::new("devnet".to_string(), 3, 1); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index cc7851477f2..be9b04a90f1 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -462,8 +462,8 @@ impl EpochService for FakeEpochService { #[cfg(test)] mod tests { use mithril_common::entities::PartyId; - use mithril_common::store::adapter::MemoryAdapter; use mithril_common::test_utils::{fake_data, MithrilFixture, MithrilFixtureBuilder}; + use mithril_persistence::store::adapter::MemoryAdapter; use std::collections::{BTreeSet, HashMap}; use crate::services::epoch_service::tests::ServiceBuilderParameters::WithFutureProtocolParameters; diff --git a/mithril-aggregator/src/services/message.rs b/mithril-aggregator/src/services/message.rs index 0e3ef25f9df..f9c2150fa10 100644 --- a/mithril-aggregator/src/services/message.rs +++ b/mithril-aggregator/src/services/message.rs @@ -1,4 +1,4 @@ -//! This service is responsible of providing HTTP server with messages as fast as possible. +//! This service is responsible for providing HTTP server with messages as fast as possible. use std::sync::Arc; @@ -8,6 +8,7 @@ use thiserror::Error; use mithril_common::{ entities::SignedEntityTypeDiscriminants, messages::{ + CardanoTransactionCommitmentListMessage, CardanoTransactionCommitmentMessage, CertificateListMessage, CertificateMessage, MithrilStakeDistributionListMessage, MithrilStakeDistributionMessage, SnapshotListMessage, SnapshotMessage, }, @@ -61,6 +62,18 @@ pub trait MessageService: Sync + Send { &self, limit: usize, ) -> StdResult; + + /// Return the information regarding the Cardano transactions set for the given identifier. + async fn get_cardano_transaction_message( + &self, + signed_entity_id: &str, + ) -> StdResult>; + + /// Return the list of the last Cardano transactions set message + async fn get_cardano_transaction_list_message( + &self, + limit: usize, + ) -> StdResult; } /// Implementation of the [MessageService] @@ -148,6 +161,31 @@ impl MessageService for MithrilMessageService { entities.into_iter().map(|i| i.try_into()).collect() } + + async fn get_cardano_transaction_message( + &self, + signed_entity_id: &str, + ) -> StdResult> { + let signed_entity = self + .signed_entity_storer + .get_signed_entity(signed_entity_id) + .await?; + + signed_entity.map(|v| v.try_into()).transpose() + } + + async fn get_cardano_transaction_list_message( + &self, + limit: usize, + ) -> StdResult { + let signed_entity_type_id = SignedEntityTypeDiscriminants::CardanoTransactions; + let entities = self + .signed_entity_storer + .get_last_signed_entities_by_type(&signed_entity_type_id, limit) + .await?; + + entities.into_iter().map(|i| i.try_into()).collect() + } } #[cfg(test)] @@ -155,7 +193,10 @@ mod tests { use std::sync::Arc; use mithril_common::{ - entities::{Beacon, MithrilStakeDistribution, SignedEntity, SignedEntityType, Snapshot}, + entities::{ + Beacon, CardanoTransactionsCommitment, MithrilStakeDistribution, SignedEntity, + SignedEntityType, Snapshot, + }, messages::ToMessageAdapter, test_utils::MithrilFixtureBuilder, }; @@ -164,6 +205,7 @@ mod tests { database::provider::{MockSignedEntityStorer, SignedEntityRecord}, dependency_injection::DependenciesBuilder, message_adapters::{ + ToCardanoTransactionListMessageAdapter, ToCardanoTransactionMessageAdapter, ToMithrilStakeDistributionListMessageAdapter, ToMithrilStakeDistributionMessageAdapter, ToSnapshotListMessageAdapter, ToSnapshotMessageAdapter, }, @@ -252,7 +294,7 @@ mod tests { } #[tokio::test] - async fn get_no_snapshot() { + async fn get_snapshot_not_exist() { let configuration = Configuration::new_sample(); let mut dep_builder = DependenciesBuilder::new(configuration); let service = dep_builder.get_message_service().await.unwrap(); @@ -350,7 +392,7 @@ mod tests { } #[tokio::test] - async fn get_mithril_no_stake_distribution() { + async fn get_mithril_stake_distribution_not_exist() { let configuration = Configuration::new_sample(); let mut dep_builder = DependenciesBuilder::new(configuration); let mut storer = MockSignedEntityStorer::new(); @@ -395,4 +437,84 @@ mod tests { assert_eq!(message, response); } + + #[tokio::test] + async fn get_cardano_transaction() { + let entity = SignedEntity::::dummy(); + let record = SignedEntityRecord { + signed_entity_id: entity.signed_entity_id.clone(), + signed_entity_type: SignedEntityType::CardanoTransactions( + entity.artifact.beacon.clone(), + ), + certificate_id: entity.certificate_id.clone(), + artifact: serde_json::to_string(&entity.artifact).unwrap(), + created_at: entity.created_at, + }; + let message = ToCardanoTransactionMessageAdapter::adapt(entity); + let configuration = Configuration::new_sample(); + let mut dep_builder = DependenciesBuilder::new(configuration); + let mut storer = MockSignedEntityStorer::new(); + storer + .expect_get_signed_entity() + .return_once(|_| Ok(Some(record))) + .once(); + dep_builder.signed_entity_storer = Some(Arc::new(storer)); + let service = dep_builder.get_message_service().await.unwrap(); + let response = service + .get_cardano_transaction_message("whatever") + .await + .unwrap() + .expect("A CardanoTransactionMessage was expected."); + + assert_eq!(message, response); + } + + #[tokio::test] + async fn get_cardano_transaction_not_exist() { + let configuration = Configuration::new_sample(); + let mut dep_builder = DependenciesBuilder::new(configuration); + let mut storer = MockSignedEntityStorer::new(); + storer + .expect_get_signed_entity() + .return_once(|_| Ok(None)) + .once(); + dep_builder.signed_entity_storer = Some(Arc::new(storer)); + let service = dep_builder.get_message_service().await.unwrap(); + let response = service + .get_cardano_transaction_message("whatever") + .await + .unwrap(); + + assert!(response.is_none()); + } + + #[tokio::test] + async fn get_cardano_transaction_list_message() { + let entity = SignedEntity::::dummy(); + let records = vec![SignedEntityRecord { + signed_entity_id: entity.signed_entity_id.clone(), + signed_entity_type: SignedEntityType::CardanoTransactions( + entity.artifact.beacon.clone(), + ), + certificate_id: entity.certificate_id.clone(), + artifact: serde_json::to_string(&entity.artifact).unwrap(), + created_at: entity.created_at, + }]; + let message = ToCardanoTransactionListMessageAdapter::adapt(vec![entity]); + let configuration = Configuration::new_sample(); + let mut dep_builder = DependenciesBuilder::new(configuration); + let mut storer = MockSignedEntityStorer::new(); + storer + .expect_get_last_signed_entities_by_type() + .return_once(|_, _| Ok(records)) + .once(); + dep_builder.signed_entity_storer = Some(Arc::new(storer)); + let service = dep_builder.get_message_service().await.unwrap(); + let response = service + .get_cardano_transaction_list_message(10) + .await + .unwrap(); + + assert_eq!(message, response); + } } diff --git a/mithril-aggregator/src/services/mod.rs b/mithril-aggregator/src/services/mod.rs index 1b9173cb5f0..2891f6e6143 100644 --- a/mithril-aggregator/src/services/mod.rs +++ b/mithril-aggregator/src/services/mod.rs @@ -12,6 +12,7 @@ mod certifier; mod epoch_service; mod message; +mod prover; mod signed_entity; mod stake_distribution; mod ticker; @@ -19,6 +20,7 @@ mod ticker; pub use certifier::*; pub use epoch_service::*; pub use message::*; +pub use prover::*; pub use signed_entity::*; pub use stake_distribution::*; pub use ticker::*; diff --git a/mithril-aggregator/src/services/prover.rs b/mithril-aggregator/src/services/prover.rs new file mode 100644 index 00000000000..ae5bb3f5294 --- /dev/null +++ b/mithril-aggregator/src/services/prover.rs @@ -0,0 +1,192 @@ +use std::sync::Arc; + +use anyhow::Context; +use async_trait::async_trait; + +use mithril_common::{ + crypto_helper::{MKTree, MKTreeNode, MKTreeStore}, + entities::{Beacon, CardanoTransaction, CardanoTransactionsSetProof, TransactionHash}, + StdResult, +}; + +#[cfg(test)] +use mockall::automock; + +/// Prover service is the cryptographic engine in charge of producing cryptographic proofs for transactions +#[cfg_attr(test, automock)] +#[async_trait] +pub trait ProverService: Sync + Send { + /// Compute the cryptographic proofs for the given transactions + async fn compute_transactions_proofs( + &self, + up_to: &Beacon, + transaction_hashes: &[TransactionHash], + ) -> StdResult>; +} + +/// Transactions retriever +#[cfg_attr(test, automock)] +#[async_trait] +pub trait TransactionsRetriever: Sync + Send { + /// Get transactions up to given beacon + async fn get_up_to(&self, beacon: &Beacon) -> StdResult>; +} + +/// Mithril prover +pub struct MithrilProverService { + transaction_retriever: Arc, +} + +impl MithrilProverService { + /// Create a new Mithril prover + pub fn new(transaction_retriever: Arc) -> Self { + Self { + transaction_retriever, + } + } +} + +#[async_trait] +impl ProverService for MithrilProverService { + async fn compute_transactions_proofs( + &self, + up_to: &Beacon, + transaction_hashes: &[TransactionHash], + ) -> StdResult> { + let transactions = self.transaction_retriever.get_up_to(up_to).await?; + let mk_leaves_all: Vec = + transactions.iter().map(|t| t.to_owned().into()).collect(); + let store = MKTreeStore::default(); + let mktree = MKTree::new(&mk_leaves_all, &store) + .with_context(|| "MKTree creation should not fail")?; + + let mut transaction_hashes_certified = vec![]; + for transaction_hash in transaction_hashes { + let mk_leaf = transaction_hash.to_string().into(); + if mktree.compute_proof(&[mk_leaf]).is_ok() { + transaction_hashes_certified.push(transaction_hash.to_string()); + } + } + + if !transaction_hashes_certified.is_empty() { + let mk_leaves: Vec = transaction_hashes_certified + .iter() + .map(|h| h.to_owned().into()) + .collect(); + let mk_proof = mktree.compute_proof(&mk_leaves)?; + let transactions_set_proof_batch = + CardanoTransactionsSetProof::new(transaction_hashes_certified, mk_proof); + + Ok(vec![transactions_set_proof_batch]) + } else { + Ok(vec![]) + } + } +} + +#[cfg(test)] +mod tests { + use anyhow::anyhow; + use mithril_common::entities::CardanoTransaction; + use mithril_common::test_utils::fake_data; + use mockall::predicate::eq; + + use super::*; + + fn generate_transactions( + total_transactions: usize, + ) -> (Vec, Vec) { + let mut hashes = vec![]; + let mut transactions = vec![]; + + for i in 1..=total_transactions { + let hash = format!("tx-{}", i); + transactions.push(CardanoTransaction::new(&hash, 10 * i as u64, i as u64)); + hashes.push(hash); + } + + (hashes, transactions) + } + + #[tokio::test] + async fn compute_proof_for_one_set_with_multiple_transactions() { + let (transaction_hashes, transactions) = generate_transactions(3); + let mut transaction_retriever = MockTransactionsRetriever::new(); + transaction_retriever + .expect_get_up_to() + .with(eq(fake_data::beacon())) + .return_once(move |_| Ok(transactions)); + let prover = MithrilProverService::new(Arc::new(transaction_retriever)); + let transactions_set_proof = prover + .compute_transactions_proofs(&fake_data::beacon(), &transaction_hashes) + .await + .unwrap(); + + assert_eq!(transactions_set_proof.len(), 1); + assert_eq!( + transactions_set_proof[0].transactions_hashes(), + transaction_hashes + ); + transactions_set_proof[0].verify().unwrap(); + } + + #[tokio::test] + async fn cant_compute_proof_for_unknown_transaction() { + let (transaction_hashes, _transactions) = generate_transactions(3); + let mut transaction_retriever = MockTransactionsRetriever::new(); + transaction_retriever + .expect_get_up_to() + .with(eq(fake_data::beacon())) + .returning(|_| Ok(vec![])); + let prover = MithrilProverService::new(Arc::new(transaction_retriever)); + let transactions_set_proof = prover + .compute_transactions_proofs(&fake_data::beacon(), &transaction_hashes) + .await + .unwrap(); + + assert_eq!(transactions_set_proof.len(), 0); + } + + #[tokio::test] + async fn compute_proof_for_one_set_of_three_known_transactions_and_two_unknowns() { + let (transaction_hashes, transactions) = generate_transactions(5); + // The last two are not in the "store" + let transactions = transactions[0..=2].to_vec(); + let mut transaction_retriever = MockTransactionsRetriever::new(); + transaction_retriever + .expect_get_up_to() + .with(eq(fake_data::beacon())) + .return_once(move |_| Ok(transactions)); + let prover = MithrilProverService::new(Arc::new(transaction_retriever)); + let transactions_set_proof = prover + .compute_transactions_proofs(&fake_data::beacon(), &transaction_hashes) + .await + .unwrap(); + + assert_eq!(transactions_set_proof.len(), 1); + assert_eq!( + transactions_set_proof[0].transactions_hashes(), + &transaction_hashes[0..=2].to_vec() + ); + transactions_set_proof[0].verify().unwrap(); + } + + // this one can't be done right now because we don't have a merkle tree of merkle tree yet + // todo: compute_proof_for_multiple_set_with_multiple_transactions + + #[tokio::test] + async fn cant_compute_proof_if_retriever_fail() { + let (transaction_hashes, _transactions) = generate_transactions(3); + let mut transaction_retriever = MockTransactionsRetriever::new(); + transaction_retriever + .expect_get_up_to() + .with(eq(fake_data::beacon())) + .returning(|_| Err(anyhow!("Error"))); + + let prover = MithrilProverService::new(Arc::new(transaction_retriever)); + prover + .compute_transactions_proofs(&fake_data::beacon(), &transaction_hashes) + .await + .expect_err("Should have failed because of its retriever"); + } +} diff --git a/mithril-aggregator/src/services/signed_entity.rs b/mithril-aggregator/src/services/signed_entity.rs index 3b50202e273..bf7b416d483 100644 --- a/mithril-aggregator/src/services/signed_entity.rs +++ b/mithril-aggregator/src/services/signed_entity.rs @@ -10,8 +10,8 @@ use std::sync::Arc; use mithril_common::{ entities::{ - Beacon, Certificate, Epoch, MithrilStakeDistribution, SignedEntity, SignedEntityType, - SignedEntityTypeDiscriminants, Snapshot, + Beacon, CardanoTransactionsCommitment, Certificate, Epoch, MithrilStakeDistribution, + SignedEntity, SignedEntityType, SignedEntityTypeDiscriminants, Snapshot, }, signable_builder::Artifact, StdResult, @@ -49,6 +49,11 @@ pub trait SignedEntityService: Send + Sync { total: usize, ) -> StdResult>>; + /// Return the last signed Cardano Transaction Commitment. + async fn get_last_cardano_transaction_commitment( + &self, + ) -> StdResult>>; + /// Return a signed snapshot async fn get_signed_snapshot_by_id( &self, @@ -68,6 +73,8 @@ pub struct MithrilSignedEntityService { mithril_stake_distribution_artifact_builder: Arc>, cardano_immutable_files_full_artifact_builder: Arc>, + cardano_transactions_artifact_builder: + Arc>, } impl MithrilSignedEntityService { @@ -78,11 +85,15 @@ impl MithrilSignedEntityService { dyn ArtifactBuilder, >, cardano_immutable_files_full_artifact_builder: Arc>, + cardano_transactions_artifact_builder: Arc< + dyn ArtifactBuilder, + >, ) -> Self { Self { signed_entity_storer, mithril_stake_distribution_artifact_builder, cardano_immutable_files_full_artifact_builder, + cardano_transactions_artifact_builder, } } @@ -114,8 +125,34 @@ impl MithrilSignedEntityService { })?, )), SignedEntityType::CardanoStakeDistribution(_) => todo!(), + SignedEntityType::CardanoTransactions(beacon) => Ok(Arc::new( + self.cardano_transactions_artifact_builder + .compute_artifact(beacon.clone(), certificate) + .await + .with_context(|| { + format!( + "Signed Entity Service can not compute artifact for entity type: '{signed_entity_type}'" + ) + })?, + )), } } + + async fn get_last_signed_entities( + &self, + total: usize, + discriminants: &SignedEntityTypeDiscriminants, + ) -> StdResult> { + self.signed_entity_storer + .get_last_signed_entities_by_type(discriminants, total) + .await + .with_context(|| { + format!( + "Signed Entity Service can not get last signed entities with type: '{:?}'", + discriminants + ) + }) + } } #[async_trait] @@ -161,7 +198,6 @@ impl SignedEntityService for MithrilSignedEntityService { "Signed Entity Service can not store signed entity with type: '{signed_entity_type}'" ) })?; - Ok(()) } @@ -170,18 +206,11 @@ impl SignedEntityService for MithrilSignedEntityService { total: usize, ) -> StdResult>> { let signed_entities_records = self - .signed_entity_storer - .get_last_signed_entities_by_type( - &SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + .get_last_signed_entities( total, + &SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, ) - .await - .with_context(|| { - format!( - "Signed Entity Service can not get last signed entities with type: '{:?}'", - &SignedEntityTypeDiscriminants::CardanoImmutableFilesFull - ) - })?; + .await?; let mut signed_entities: Vec> = Vec::new(); for record in signed_entities_records { @@ -196,18 +225,11 @@ impl SignedEntityService for MithrilSignedEntityService { total: usize, ) -> StdResult>> { let signed_entities_records = self - .signed_entity_storer - .get_last_signed_entities_by_type( - &SignedEntityTypeDiscriminants::MithrilStakeDistribution, + .get_last_signed_entities( total, + &SignedEntityTypeDiscriminants::MithrilStakeDistribution, ) - .await - .with_context(|| { - format!( - "Signed Entity Service can not get last signed entities with type: '{:?}'", - &SignedEntityTypeDiscriminants::MithrilStakeDistribution - ) - })?; + .await?; let mut signed_entities: Vec> = Vec::new(); for record in signed_entities_records { @@ -217,6 +239,19 @@ impl SignedEntityService for MithrilSignedEntityService { Ok(signed_entities) } + async fn get_last_cardano_transaction_commitment( + &self, + ) -> StdResult>> { + let mut signed_entities_records = self + .get_last_signed_entities(1, &SignedEntityTypeDiscriminants::CardanoTransactions) + .await?; + + match signed_entities_records.pop() { + Some(record) => Ok(Some(record.try_into()?)), + None => Ok(None), + } + } + async fn get_signed_snapshot_by_id( &self, signed_entity_id: &str, @@ -260,7 +295,12 @@ impl SignedEntityService for MithrilSignedEntityService { #[cfg(test)] mod tests { - use mithril_common::{entities::Epoch, test_utils::fake_data}; + use mithril_common::{ + entities::{CardanoTransactionsCommitment, Epoch}, + signable_builder, + test_utils::fake_data, + }; + use serde::{de::DeserializeOwned, Serialize}; use super::*; @@ -268,83 +308,212 @@ mod tests { artifact_builder::MockArtifactBuilder, database::provider::MockSignedEntityStorer, }; + fn create_stake_distribution(epoch: Epoch, signers: usize) -> MithrilStakeDistribution { + MithrilStakeDistribution::new( + epoch, + fake_data::signers_with_stakes(signers), + &fake_data::protocol_parameters(), + ) + } + + fn assert_expected(expected: &T, artifact: &Arc) + where + T: Serialize + DeserializeOwned, + { + let current: T = serde_json::from_str(&serde_json::to_string(&artifact).unwrap()).unwrap(); + assert_eq!( + serde_json::to_string(&expected).unwrap(), + serde_json::to_string(¤t).unwrap() + ); + } + + /// Struct that create mocks needed in tests and build objects injecting them. + struct MockDependencyInjector { + mock_signed_entity_storer: MockSignedEntityStorer, + mock_mithril_stake_distribution_artifact_builder: + MockArtifactBuilder, + mock_cardano_immutable_files_full_artifact_builder: MockArtifactBuilder, + mock_cardano_transactions_artifact_builder: + MockArtifactBuilder, + } + + impl MockDependencyInjector { + fn new() -> MockDependencyInjector { + MockDependencyInjector { + mock_signed_entity_storer: MockSignedEntityStorer::new(), + mock_mithril_stake_distribution_artifact_builder: MockArtifactBuilder::< + Epoch, + MithrilStakeDistribution, + >::new(), + mock_cardano_immutable_files_full_artifact_builder: MockArtifactBuilder::< + Beacon, + Snapshot, + >::new(), + mock_cardano_transactions_artifact_builder: MockArtifactBuilder::< + Beacon, + CardanoTransactionsCommitment, + >::new(), + } + } + + fn build_artifact_builder_service(self) -> MithrilSignedEntityService { + MithrilSignedEntityService::new( + Arc::new(self.mock_signed_entity_storer), + Arc::new(self.mock_mithril_stake_distribution_artifact_builder), + Arc::new(self.mock_cardano_immutable_files_full_artifact_builder), + Arc::new(self.mock_cardano_transactions_artifact_builder), + ) + } + } + #[tokio::test] async fn build_mithril_stake_distribution_artifact_when_given_mithril_stake_distribution_entity_type( ) { - let signers_with_stake = fake_data::signers_with_stakes(5); - let mithril_stake_distribution_expected = MithrilStakeDistribution::new( - Epoch(1), - signers_with_stake, - &fake_data::protocol_parameters(), - ); - let mithril_stake_distribution_clone = mithril_stake_distribution_expected.clone(); + let mut mock_container = MockDependencyInjector::new(); - let mock_signed_entity_storer = MockSignedEntityStorer::new(); + let mithril_stake_distribution_expected = create_stake_distribution(Epoch(1), 5); - let mut mock_mithril_stake_distribution_artifact_builder = - MockArtifactBuilder::::new(); - mock_mithril_stake_distribution_artifact_builder + mock_container + .mock_mithril_stake_distribution_artifact_builder .expect_compute_artifact() - .once() - .return_once(move |_, _| Ok(mithril_stake_distribution_clone)); + .times(1) + .returning(|_, _| Ok(create_stake_distribution(Epoch(1), 5))); - let mock_cardano_immutable_files_full_artifact_builder = - MockArtifactBuilder::::new(); + let artifact_builder_service = mock_container.build_artifact_builder_service(); - let artifact_builder_service = MithrilSignedEntityService::new( - Arc::new(mock_signed_entity_storer), - Arc::new(mock_mithril_stake_distribution_artifact_builder), - Arc::new(mock_cardano_immutable_files_full_artifact_builder), - ); let certificate = fake_data::certificate("hash".to_string()); - let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); let artifact = artifact_builder_service - .compute_artifact(signed_entity_type, &certificate) + .compute_artifact(signed_entity_type.clone(), &certificate) .await .unwrap(); - let mithril_stake_distribution_computed: MithrilStakeDistribution = - serde_json::from_str(&serde_json::to_string(&artifact).unwrap()).unwrap(); - assert_eq!( - serde_json::to_string(&mithril_stake_distribution_expected).unwrap(), - serde_json::to_string(&mithril_stake_distribution_computed).unwrap() - ); + + assert_expected(&mithril_stake_distribution_expected, &artifact); + } + + #[tokio::test] + async fn should_store_the_artifact_when_creating_artifact_for_a_mithril_stake_distribution() { + generic_test_that_the_artifact_is_stored( + SignedEntityType::MithrilStakeDistribution(Epoch(1)), + create_stake_distribution(Epoch(1), 5), + &|mock_injector| &mut mock_injector.mock_mithril_stake_distribution_artifact_builder, + ) + .await; } #[tokio::test] async fn build_snapshot_artifact_when_given_cardano_immutable_files_full_entity_type() { + let mut mock_container = MockDependencyInjector::new(); + let snapshot_expected = fake_data::snapshots(1).first().unwrap().to_owned(); - let snapshot_expected_clone = snapshot_expected.clone(); - let mock_signed_entity_storer = MockSignedEntityStorer::new(); + mock_container + .mock_cardano_immutable_files_full_artifact_builder + .expect_compute_artifact() + .times(1) + .returning(|_, _| Ok(fake_data::snapshots(1).first().unwrap().to_owned())); + + let artifact_builder_service = mock_container.build_artifact_builder_service(); + + let certificate = fake_data::certificate("hash".to_string()); + let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(Beacon::default()); + let artifact = artifact_builder_service + .compute_artifact(signed_entity_type.clone(), &certificate) + .await + .unwrap(); + + assert_expected(&snapshot_expected, &artifact); + } + + #[tokio::test] + async fn should_store_the_artifact_when_creating_artifact_for_a_cardano_immutable_files() { + generic_test_that_the_artifact_is_stored( + SignedEntityType::CardanoImmutableFilesFull(Beacon::default()), + fake_data::snapshots(1).first().unwrap().to_owned(), + &|mock_injector| &mut mock_injector.mock_cardano_immutable_files_full_artifact_builder, + ) + .await; + } + + #[tokio::test] + async fn build_cardano_transactions_commitment_artifact_when_given_cardano_transactions_type() { + let mut mock_container = MockDependencyInjector::new(); - let mock_mithril_stake_distribution_artifact_builder = - MockArtifactBuilder::::new(); + let expected = + CardanoTransactionsCommitment::new("merkle_root".to_string(), Beacon::default()); - let mut mock_cardano_immutable_files_full_artifact_builder = - MockArtifactBuilder::::new(); - mock_cardano_immutable_files_full_artifact_builder + mock_container + .mock_cardano_transactions_artifact_builder .expect_compute_artifact() - .once() - .return_once(move |_, _| Ok(snapshot_expected_clone)); + .times(1) + .returning(|_, _| { + Ok(CardanoTransactionsCommitment::new( + "merkle_root".to_string(), + Beacon::default(), + )) + }); - let artifact_builder_service = MithrilSignedEntityService::new( - Arc::new(mock_signed_entity_storer), - Arc::new(mock_mithril_stake_distribution_artifact_builder), - Arc::new(mock_cardano_immutable_files_full_artifact_builder), - ); - let certificate = fake_data::certificate("hash".to_string()); + let artifact_builder_service = mock_container.build_artifact_builder_service(); - let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(Beacon::default()); + let certificate = fake_data::certificate("hash".to_string()); + let signed_entity_type = SignedEntityType::CardanoTransactions(Beacon::default()); let artifact = artifact_builder_service - .compute_artifact(signed_entity_type, &certificate) + .compute_artifact(signed_entity_type.clone(), &certificate) .await .unwrap(); - let snapshot_computed: Snapshot = - serde_json::from_str(&serde_json::to_string(&artifact).unwrap()).unwrap(); - assert_eq!( - serde_json::to_string(&snapshot_expected).unwrap(), - serde_json::to_string(&snapshot_computed).unwrap() + + assert_expected(&expected, &artifact); + } + + #[tokio::test] + async fn should_store_the_artifact_when_creating_artifact_for_cardano_transactions() { + generic_test_that_the_artifact_is_stored( + SignedEntityType::CardanoTransactions(Beacon::default()), + CardanoTransactionsCommitment::new("merkle_root".to_string(), Beacon::default()), + &|mock_injector| &mut mock_injector.mock_cardano_transactions_artifact_builder, + ) + .await; + } + + async fn generic_test_that_the_artifact_is_stored< + T: Artifact + Clone + Serialize + 'static, + U: signable_builder::Beacon, + >( + signed_entity_type: SignedEntityType, + artifact: T, + mock_that_provide_artifact: &dyn Fn( + &mut MockDependencyInjector, + ) -> &mut MockArtifactBuilder, + ) { + let mut mock_container = MockDependencyInjector::new(); + { + let artifact_clone: Arc = Arc::new(artifact.clone()); + let signed_entity_artifact = serde_json::to_string(&artifact_clone).unwrap(); + mock_container + .mock_signed_entity_storer + .expect_store_signed_entity() + .withf(move |signed_entity| signed_entity.artifact == signed_entity_artifact) + .return_once(|_| Ok(())); + } + { + let artifact_cloned = artifact.clone(); + mock_that_provide_artifact(&mut mock_container) + .expect_compute_artifact() + .times(1) + .return_once(|_, _| Ok(artifact_cloned)); + } + let artifact_builder_service = mock_container.build_artifact_builder_service(); + + let certificate = fake_data::certificate("hash".to_string()); + let error_message = format!( + "Create artifact should not fail for {} signed entity", + std::any::type_name::() ); + let error_message_str = error_message.as_str(); + + artifact_builder_service + .create_artifact(signed_entity_type, &certificate) + .await + .expect(error_message_str); } } diff --git a/mithril-aggregator/src/services/stake_distribution.rs b/mithril-aggregator/src/services/stake_distribution.rs index 20820d046a2..61fa9651ab5 100644 --- a/mithril-aggregator/src/services/stake_distribution.rs +++ b/mithril-aggregator/src/services/stake_distribution.rs @@ -11,9 +11,9 @@ use tokio::sync::{Mutex, MutexGuard}; use mithril_common::{ chain_observer::ChainObserver, entities::{Epoch, StakeDistribution}, - store::StakeStorer, StdError, StdResult, }; +use mithril_persistence::store::StakeStorer; use crate::database::provider::StakePoolStore; diff --git a/mithril-aggregator/src/signer_registerer.rs b/mithril-aggregator/src/signer_registerer.rs index d03545df0f3..9b93e9cb812 100644 --- a/mithril-aggregator/src/signer_registerer.rs +++ b/mithril-aggregator/src/signer_registerer.rs @@ -287,13 +287,12 @@ impl SignerRegisterer for MithrilSignerRegisterer { mod tests { use std::{collections::HashMap, sync::Arc}; - use mithril_common::test_utils::fake_data; use mithril_common::{ chain_observer::FakeObserver, entities::{Epoch, PartyId, Signer, SignerWithStake}, - store::adapter::MemoryAdapter, - test_utils::MithrilFixtureBuilder, + test_utils::{fake_data, MithrilFixtureBuilder}, }; + use mithril_persistence::store::adapter::MemoryAdapter; use crate::{ MithrilSignerRegisterer, SignerRegisterer, SignerRegistrationRoundOpener, diff --git a/mithril-aggregator/src/store/pending_certificate_store.rs b/mithril-aggregator/src/store/pending_certificate_store.rs index cc8719d9cb8..19648b8dadf 100644 --- a/mithril-aggregator/src/store/pending_certificate_store.rs +++ b/mithril-aggregator/src/store/pending_certificate_store.rs @@ -3,7 +3,7 @@ use mithril_common::StdResult; use tokio::sync::RwLock; use mithril_common::entities::CertificatePending; -use mithril_common::store::adapter::StoreAdapter; +use mithril_persistence::store::adapter::StoreAdapter; type Adapter = Box>; @@ -65,8 +65,8 @@ mod test { use super::*; use mithril_common::entities::{Beacon, SignedEntityType}; - use mithril_common::store::adapter::DumbStoreAdapter; use mithril_common::test_utils::fake_data; + use mithril_persistence::store::adapter::DumbStoreAdapter; async fn get_certificate_pending_store(is_populated: bool) -> CertificatePendingStore { let mut adapter: DumbStoreAdapter = DumbStoreAdapter::new(); diff --git a/mithril-aggregator/src/store/protocol_parameters_store.rs b/mithril-aggregator/src/store/protocol_parameters_store.rs index 75a5785a334..01a9aa59202 100644 --- a/mithril-aggregator/src/store/protocol_parameters_store.rs +++ b/mithril-aggregator/src/store/protocol_parameters_store.rs @@ -4,7 +4,7 @@ use mithril_common::StdResult; use tokio::sync::RwLock; use mithril_common::entities::{Epoch, ProtocolParameters}; -use mithril_common::store::{adapter::StoreAdapter, StorePruner}; +use mithril_persistence::store::{adapter::StoreAdapter, StorePruner}; type Adapter = Box>; @@ -91,7 +91,8 @@ impl ProtocolParametersStorer for ProtocolParametersStore { mod tests { use super::*; - use mithril_common::{store::adapter::MemoryAdapter, test_utils::fake_data}; + use mithril_common::test_utils::fake_data; + use mithril_persistence::store::adapter::MemoryAdapter; fn setup_protocol_parameters(nb_epoch: u64) -> Vec<(Epoch, ProtocolParameters)> { let mut values: Vec<(Epoch, ProtocolParameters)> = Vec::new(); diff --git a/mithril-aggregator/src/store/verification_key_store.rs b/mithril-aggregator/src/store/verification_key_store.rs index b005c01cb1a..5a5e96c5184 100644 --- a/mithril-aggregator/src/store/verification_key_store.rs +++ b/mithril-aggregator/src/store/verification_key_store.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; use tokio::sync::RwLock; use mithril_common::entities::{Epoch, PartyId, Signer, SignerWithStake}; -use mithril_common::store::adapter::StoreAdapter; +use mithril_persistence::store::adapter::StoreAdapter; #[cfg(test)] use mockall::automock; @@ -350,10 +350,8 @@ pub mod test_suite { #[cfg(test)] mod tests { - use mithril_common::{ - entities::{Epoch, PartyId, SignerWithStake}, - store::adapter::MemoryAdapter, - }; + use mithril_common::entities::{Epoch, PartyId, SignerWithStake}; + use mithril_persistence::store::adapter::MemoryAdapter; use std::{collections::HashMap, sync::Arc}; use crate::{VerificationKeyStore, VerificationKeyStorer}; diff --git a/mithril-aggregator/src/tools/certificates_hash_migrator.rs b/mithril-aggregator/src/tools/certificates_hash_migrator.rs index 9f6961df455..e2ec077c0a2 100644 --- a/mithril-aggregator/src/tools/certificates_hash_migrator.rs +++ b/mithril-aggregator/src/tools/certificates_hash_migrator.rs @@ -196,13 +196,14 @@ mod test { entities::{ Beacon, Certificate, Epoch, ImmutableFileNumber, SignedEntityType::{ - CardanoImmutableFilesFull, CardanoStakeDistribution, MithrilStakeDistribution, + CardanoImmutableFilesFull, CardanoStakeDistribution, CardanoTransactions, + MithrilStakeDistribution, }, SignedEntityTypeDiscriminants, }, - sqlite::SqliteConnection, StdResult, }; + use mithril_persistence::sqlite::SqliteConnection; use sqlite::Connection; use std::{collections::HashMap, sync::Arc}; @@ -283,6 +284,9 @@ mod test { SignedEntityTypeDiscriminants::CardanoImmutableFilesFull => { CardanoImmutableFilesFull(certificate.beacon.clone()) } + SignedEntityTypeDiscriminants::CardanoTransactions => { + CardanoTransactions(certificate.beacon.clone()) + } }; // Note: we don't need to have real artifacts for those tests let artifact = format!("{signed_entity_type:?}"); diff --git a/mithril-aggregator/src/tools/signer_importer.rs b/mithril-aggregator/src/tools/signer_importer.rs index 0c6b4c36073..748a04b5c3a 100644 --- a/mithril-aggregator/src/tools/signer_importer.rs +++ b/mithril-aggregator/src/tools/signer_importer.rs @@ -180,9 +180,9 @@ impl SPOItem { #[cfg(test)] mod tests { - use mithril_common::sqlite::SqliteConnection; use mithril_common::test_utils::test_http_server::test_http_server; use mithril_common::StdResult; + use mithril_persistence::sqlite::SqliteConnection; use sqlite::Connection; use std::collections::{BTreeMap, BTreeSet}; use std::convert::Infallible; diff --git a/mithril-aggregator/tests/certificate_chain.rs b/mithril-aggregator/tests/certificate_chain.rs index b5f85ca945e..ce111993ed7 100644 --- a/mithril-aggregator/tests/certificate_chain.rs +++ b/mithril-aggregator/tests/certificate_chain.rs @@ -19,7 +19,7 @@ async fn certificate_chain() { }; let configuration = Configuration { protocol_parameters: protocol_parameters.clone(), - data_stores_directory: get_test_dir("certificate_chain").join("aggregator.sqlite3"), + data_stores_directory: get_test_dir("certificate_chain"), ..Configuration::new_sample() }; let mut tester = diff --git a/mithril-aggregator/tests/create_certificate.rs b/mithril-aggregator/tests/create_certificate.rs index 2e28d416285..ecfda3cf7cb 100644 --- a/mithril-aggregator/tests/create_certificate.rs +++ b/mithril-aggregator/tests/create_certificate.rs @@ -19,7 +19,7 @@ async fn create_certificate() { }; let configuration = Configuration { protocol_parameters: protocol_parameters.clone(), - data_stores_directory: get_test_dir("create_certificate").join("aggregator.sqlite3"), + data_stores_directory: get_test_dir("create_certificate"), ..Configuration::new_sample() }; let mut tester = diff --git a/mithril-aggregator/tests/era_checker.rs b/mithril-aggregator/tests/era_checker.rs index ba7edbb7f10..96c7945d09d 100644 --- a/mithril-aggregator/tests/era_checker.rs +++ b/mithril-aggregator/tests/era_checker.rs @@ -20,7 +20,7 @@ async fn testing_eras() { }; let configuration = Configuration { protocol_parameters: protocol_parameters.clone(), - data_stores_directory: get_test_dir("testing_eras").join("aggregator.sqlite3"), + data_stores_directory: get_test_dir("testing_eras"), ..Configuration::new_sample() }; let mut tester = diff --git a/mithril-aggregator/tests/genesis_to_signing.rs b/mithril-aggregator/tests/genesis_to_signing.rs index 7455ebd8e3f..bcfdd13dee9 100644 --- a/mithril-aggregator/tests/genesis_to_signing.rs +++ b/mithril-aggregator/tests/genesis_to_signing.rs @@ -16,7 +16,7 @@ async fn genesis_to_signing() { }; let configuration = Configuration { protocol_parameters: protocol_parameters.clone(), - data_stores_directory: get_test_dir("genesis_to_signing").join("aggregator.sqlite3"), + data_stores_directory: get_test_dir("genesis_to_signing"), ..Configuration::new_sample() }; let mut tester = diff --git a/mithril-aggregator/tests/open_message_expiration.rs b/mithril-aggregator/tests/open_message_expiration.rs new file mode 100644 index 00000000000..8c431c635d7 --- /dev/null +++ b/mithril-aggregator/tests/open_message_expiration.rs @@ -0,0 +1,156 @@ +mod test_extensions; + +use std::time::Duration; + +use mithril_aggregator::Configuration; +use mithril_common::{ + entities::{ + Beacon, Epoch, ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, + StakeDistributionParty, + }, + test_utils::MithrilFixtureBuilder, +}; +use test_extensions::{utilities::get_test_dir, ExpectedCertificate, RuntimeTester}; + +#[tokio::test] +async fn open_message_expiration() { + let protocol_parameters = ProtocolParameters { + k: 5, + m: 150, + phi_f: 0.95, + }; + let configuration = Configuration { + protocol_parameters: protocol_parameters.clone(), + data_stores_directory: get_test_dir("open_message_expiration"), + ..Configuration::new_sample() + }; + let mut tester = + RuntimeTester::build(Beacon::new("devnet".to_string(), 1, 1), configuration).await; + + comment!("create signers & declare stake distribution"); + let fixture = MithrilFixtureBuilder::default() + .with_signers(10) + .with_protocol_parameters(protocol_parameters.clone()) + .build(); + + tester.init_state_from_fixture(&fixture).await.unwrap(); + + comment!("Boostrap the genesis certificate"); + tester.register_genesis_certificate(&fixture).await.unwrap(); + + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new_genesis( + Beacon::new("devnet".to_string(), 1, 1), + fixture.compute_and_encode_avk() + ) + ); + + comment!("Increase immutable number"); + tester.increase_immutable_number().await.unwrap(); + + comment!("start the runtime state machine"); + cycle!(tester, "ready"); + cycle!(tester, "signing"); + + comment!("register signers"); + tester + .register_signers(&fixture.signers_fixture()) + .await + .unwrap(); + cycle_err!(tester, "signing"); + + comment!("signers send their single signature"); + tester + .send_single_signatures( + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + &fixture.signers_fixture(), + ) + .await + .unwrap(); + + comment!("The state machine should issue a certificate for the MithrilStakeDistribution"); + cycle!(tester, "ready"); + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new( + Beacon::new("devnet".to_string(), 1, 2), + StakeDistributionParty::from_signers(fixture.signers_with_stake()).as_slice(), + fixture.compute_and_encode_avk(), + SignedEntityType::MithrilStakeDistribution(Epoch(1)), + ExpectedCertificate::genesis_identifier(&Beacon::new("devnet".to_string(), 1, 1)), + ) + ); + + comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull"); + // todo!: remove this immutable increase: + // right now because we only have one state machine for all signed entity type we need it else + // the state machine will stay in the idle state since its beacon didn't change. + // With one state machine per signed entity type this problem will disappear. + tester.increase_immutable_number().await.unwrap(); + cycle!(tester, "signing"); + + comment!( + "Schedule the open message for CardanoImmutableFilesFull to expire, and wait until it does" + ); + let open_message_timeout = Duration::from_millis(100); + tester + .activate_open_message_expiration( + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + open_message_timeout, + ) + .await + .unwrap(); + tokio::time::sleep(2 * open_message_timeout).await; + let signers_for_immutables = &fixture.signers_fixture()[0..=6]; + tester + .send_single_signatures( + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + signers_for_immutables, + ) + .await + .unwrap(); + + comment!("The state machine should not issue a certificate for the CardanoImmutableFilesFull"); + cycle!(tester, "ready"); + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new( + Beacon::new("devnet".to_string(), 1, 2), + StakeDistributionParty::from_signers(fixture.signers_with_stake()).as_slice(), + fixture.compute_and_encode_avk(), + SignedEntityType::MithrilStakeDistribution(Epoch(1)), + ExpectedCertificate::genesis_identifier(&Beacon::new("devnet".to_string(), 1, 1)), + ) + ); + + comment!("Increase the immutable file number"); + tester.increase_immutable_number().await.unwrap(); + cycle!(tester, "signing"); + + comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull"); + let signers_for_immutables = &fixture.signers_fixture()[0..=6]; + tester + .send_single_signatures( + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + signers_for_immutables, + ) + .await + .unwrap(); + + comment!("The state machine should issue a certificate for the CardanoImmutableFilesFull"); + cycle!(tester, "ready"); + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new( + Beacon::new("devnet".to_string(), 1, 4), + &signers_for_immutables + .iter() + .map(|s| s.signer_with_stake.clone().into()) + .collect::>(), + fixture.compute_and_encode_avk(), + SignedEntityType::CardanoImmutableFilesFull(Beacon::new("devnet".to_string(), 1, 4)), + ExpectedCertificate::genesis_identifier(&Beacon::new("devnet".to_string(), 1, 1)), + ) + ); +} diff --git a/mithril-aggregator/tests/open_message_newer_exists.rs b/mithril-aggregator/tests/open_message_newer_exists.rs new file mode 100644 index 00000000000..e3ca81688ca --- /dev/null +++ b/mithril-aggregator/tests/open_message_newer_exists.rs @@ -0,0 +1,124 @@ +mod test_extensions; + +use mithril_aggregator::Configuration; +use mithril_common::{ + entities::{ + Beacon, Epoch, ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, + StakeDistributionParty, + }, + test_utils::MithrilFixtureBuilder, +}; +use test_extensions::{utilities::get_test_dir, ExpectedCertificate, RuntimeTester}; + +#[tokio::test] +async fn open_message_newer_exists() { + let protocol_parameters = ProtocolParameters { + k: 5, + m: 150, + phi_f: 0.95, + }; + let configuration = Configuration { + protocol_parameters: protocol_parameters.clone(), + data_stores_directory: get_test_dir("open_message_newer_exists"), + ..Configuration::new_sample() + }; + let mut tester = + RuntimeTester::build(Beacon::new("devnet".to_string(), 1, 1), configuration).await; + + comment!("create signers & declare stake distribution"); + let fixture = MithrilFixtureBuilder::default() + .with_signers(10) + .with_protocol_parameters(protocol_parameters.clone()) + .build(); + + tester.init_state_from_fixture(&fixture).await.unwrap(); + + comment!("Boostrap the genesis certificate"); + tester.register_genesis_certificate(&fixture).await.unwrap(); + + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new_genesis( + Beacon::new("devnet".to_string(), 1, 1), + fixture.compute_and_encode_avk() + ) + ); + + comment!("Increase immutable number"); + tester.increase_immutable_number().await.unwrap(); + + comment!("start the runtime state machine"); + cycle!(tester, "ready"); + cycle!(tester, "signing"); + + comment!("register signers"); + tester + .register_signers(&fixture.signers_fixture()) + .await + .unwrap(); + cycle_err!(tester, "signing"); + + comment!("signers send their single signature"); + tester + .send_single_signatures( + SignedEntityTypeDiscriminants::MithrilStakeDistribution, + &fixture.signers_fixture(), + ) + .await + .unwrap(); + + comment!("The state machine should issue a certificate for the MithrilStakeDistribution"); + cycle!(tester, "ready"); + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new( + Beacon::new("devnet".to_string(), 1, 2), + StakeDistributionParty::from_signers(fixture.signers_with_stake()).as_slice(), + fixture.compute_and_encode_avk(), + SignedEntityType::MithrilStakeDistribution(Epoch(1)), + ExpectedCertificate::genesis_identifier(&Beacon::new("devnet".to_string(), 1, 1)), + ) + ); + + comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull"); + // todo!: remove this immutable increase: + // right now because we only have one state machine for all signed entity type we need it else + // the state machine will stay in the idle state since its beacon didn't change. + // With one state machine per signed entity type this problem will disappear. + tester.increase_immutable_number().await.unwrap(); + cycle!(tester, "signing"); + + comment!("The state machine should stay there as it is not able to create a certificate for the CardanoImmutableFilesFull"); + cycle_err!(tester, "signing"); + + comment!("Increase the immutable file number"); + tester.increase_immutable_number().await.unwrap(); + cycle!(tester, "ready"); + + comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull"); + cycle!(tester, "signing"); + let signers_for_immutables = &fixture.signers_fixture()[0..=6]; + tester + .send_single_signatures( + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, + signers_for_immutables, + ) + .await + .unwrap(); + + comment!("The state machine should issue a certificate for the CardanoImmutableFilesFull"); + cycle!(tester, "ready"); + assert_last_certificate_eq!( + tester, + ExpectedCertificate::new( + Beacon::new("devnet".to_string(), 1, 4), + &signers_for_immutables + .iter() + .map(|s| s.signer_with_stake.clone().into()) + .collect::>(), + fixture.compute_and_encode_avk(), + SignedEntityType::CardanoImmutableFilesFull(Beacon::new("devnet".to_string(), 1, 4)), + ExpectedCertificate::genesis_identifier(&Beacon::new("devnet".to_string(), 1, 1)), + ) + ); +} diff --git a/mithril-aggregator/tests/test_extensions/aggregator_observer.rs b/mithril-aggregator/tests/test_extensions/aggregator_observer.rs index 548878450c6..634d729bcf6 100644 --- a/mithril-aggregator/tests/test_extensions/aggregator_observer.rs +++ b/mithril-aggregator/tests/test_extensions/aggregator_observer.rs @@ -86,6 +86,9 @@ impl AggregatorObserver { SignedEntityTypeDiscriminants::CardanoImmutableFilesFull => { Ok(SignedEntityType::CardanoImmutableFilesFull(beacon)) } + SignedEntityTypeDiscriminants::CardanoTransactions => { + Ok(SignedEntityType::CardanoTransactions(beacon)) + } } } } diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index ffdf2bbd1f5..553b1318799 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -1,5 +1,6 @@ use anyhow::{anyhow, Context}; -use mithril_aggregator::database::provider::SignedEntityRecord; +use chrono::Utc; +use mithril_aggregator::database::provider::{OpenMessageRepository, SignedEntityRecord}; use mithril_aggregator::{ dependency_injection::DependenciesBuilder, event_store::EventMessage, AggregatorRuntime, Configuration, DependencyContainer, DumbSnapshotUploader, DumbSnapshotter, @@ -22,6 +23,7 @@ use mithril_common::{ use slog::Drain; use slog_scope::debug; use std::sync::Arc; +use std::time::Duration; use tokio::sync::mpsc::UnboundedReceiver; use crate::test_extensions::{AggregatorObserver, ExpectedCertificate}; @@ -65,6 +67,7 @@ pub struct RuntimeTester { pub receiver: UnboundedReceiver, pub era_reader_adapter: Arc, pub observer: Arc, + pub open_message_repository: Arc, _logs_guard: slog_scope::GlobalLoggerGuard, } @@ -104,6 +107,7 @@ impl RuntimeTester { let runtime = deps_builder.create_aggregator_runner().await.unwrap(); let receiver = deps_builder.get_event_transmitter_receiver().await.unwrap(); let observer = Arc::new(AggregatorObserver::new(&mut deps_builder).await); + let open_message_repository = deps_builder.get_open_message_repository().await.unwrap(); Self { snapshot_uploader, @@ -117,6 +121,7 @@ impl RuntimeTester { receiver, era_reader_adapter, observer, + open_message_repository, _logs_guard: logger, } } @@ -269,7 +274,7 @@ impl RuntimeTester { .get_open_message(&signed_entity_type) .await .with_context(|| { - format!("A open message should exist for signed_entity_type: {signed_entity_type}") + format!("An open message should exist for signed_entity_type: {signed_entity_type}") })? .ok_or(anyhow!("There should be a message to be signed."))? .protocol_message; @@ -360,6 +365,31 @@ impl RuntimeTester { .await; } + /// Activate open message expiration + pub async fn activate_open_message_expiration( + &self, + discriminant: SignedEntityTypeDiscriminants, + timeout: Duration, + ) -> StdResult<()> { + let signed_entity_type = self + .observer + .get_current_signed_entity_type(discriminant) + .await?; + let mut open_message = self + .open_message_repository + .get_open_message(&signed_entity_type) + .await + .with_context(|| "Querying open message should not fail")? + .ok_or(anyhow!("An open message should exist"))?; + open_message.expires_at = Some(Utc::now() + timeout); + self.open_message_repository + .update_open_message(&open_message) + .await + .with_context(|| "Saving open message should not fail")?; + + Ok(()) + } + /// Update the Era markers pub async fn set_era_markers(&self, markers: Vec) { self.era_reader_adapter.set_markers(markers) diff --git a/mithril-client-cli/Cargo.toml b/mithril-client-cli/Cargo.toml index 2004023960c..8a48c72046b 100644 --- a/mithril-client-cli/Cargo.toml +++ b/mithril-client-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client-cli" -version = "0.5.8" +version = "0.5.19" description = "A Mithril Client" authors = { workspace = true } edition = { workspace = true } @@ -22,45 +22,35 @@ Run `mithril-client --help` to display the available options.""" assets = [["../target/release/mithril-client", "usr/bin/", "755"]] [dependencies] -anyhow = "1.0.75" -async-recursion = "1.0.5" -async-trait = "0.1.73" -chrono = { version = "0.4.31", features = ["serde"] } -clap = { version = "4.4.6", features = ["derive", "env"] } +anyhow = "1.0.79" +async-trait = "0.1.77" +chrono = { version = "0.4.33", features = ["serde"] } +clap = { version = "4.4.18", features = ["derive", "env"] } cli-table = "0.4.7" -config = "0.13.3" -directories = "5.0.1" -flate2 = "1.0.27" -flume = "0.11.0" +config = "0.13.4" fs2 = "0.4.3" futures = "0.3.28" -hex = "0.4.3" human_bytes = { version = "0.4.3", features = ["fast"] } indicatif = { version = "0.17.7", features = ["tokio"] } +mithril-client = { path = "../mithril-client", features = ["fs"] } mithril-common = { path = "../mithril-common", features = ["full"] } -openssl = { version = "0.10.57", features = ["vendored"], optional = true } +openssl = { version = "0.10.63", features = ["vendored"], optional = true } openssl-probe = { version = "0.1.5", optional = true } -reqwest = { version = "0.11.22", features = ["json", "stream"] } -semver = "1.0.19" -serde = { version = "1.0.188", features = ["derive"] } -serde_json = "1.0.107" +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.113" slog = { version = "2.7.0", features = [ "max_level_trace", "release_max_level_debug", ] } slog-async = "2.8.0" +slog-bunyan = "2.5.0" slog-scope = "4.4.0" slog-term = "2.9.0" -tar = "0.4.40" -thiserror = "1.0.49" -tokio = { version = "1.32.0", features = ["full"] } -zstd = "0.13.0" +thiserror = "1.0.56" +tokio = { version = "1.35.1", features = ["full"] } [dev-dependencies] -httpmock = "0.6.8" mithril-common = { path = "../mithril-common", features = ["test_http_server"] } -mockall = "0.11.4" -warp = "0.3" [features] portable = ["mithril-common/portable"] diff --git a/mithril-client-cli/src/aggregator_client/certificate_client.rs b/mithril-client-cli/src/aggregator_client/certificate_client.rs deleted file mode 100644 index a543a487794..00000000000 --- a/mithril-client-cli/src/aggregator_client/certificate_client.rs +++ /dev/null @@ -1,168 +0,0 @@ -use std::sync::Arc; - -use anyhow::anyhow; -use async_trait::async_trait; - -use mithril_common::{ - certificate_chain::{CertificateRetriever, CertificateRetrieverError}, - entities::Certificate, - messages::{CertificateMessage, TryFromMessageAdapter}, - StdResult, -}; -use slog_scope::{crit, debug}; - -use crate::FromCertificateMessageAdapter; - -use super::{AggregatorClient, AggregatorHTTPClientError}; - -/// Aggregator client for the Certificate -pub struct CertificateClient { - http_client: Arc, -} - -impl CertificateClient { - /// Constructor - pub fn new(http_client: Arc) -> Self { - Self { http_client } - } - - /// Get a single certificate full information from the aggregator. - pub async fn get(&self, certificate_hash: &str) -> StdResult> { - let url = format!("certificate/{certificate_hash}"); - let response = self.http_client.get_content(&url).await; - - match response { - Err(AggregatorHTTPClientError::RemoteServerLogical(_)) => Ok(None), - Err(e) => Err(e.into()), - Ok(response) => { - let message = - serde_json::from_str::(&response).map_err(|e| { - crit!("Could not create certificate from API message: {e}."); - debug!("Certificate message = {response}"); - e - })?; - - Ok(Some(FromCertificateMessageAdapter::try_adapt(message)?)) - } - } - } -} - -#[async_trait] -impl CertificateRetriever for CertificateClient { - async fn get_certificate_details( - &self, - certificate_hash: &str, - ) -> Result { - self.get(certificate_hash) - .await - .map_err(|e| CertificateRetrieverError(anyhow!(e)))? - .ok_or(CertificateRetrieverError(anyhow!(format!( - "Certificate does not exist: '{}'", - certificate_hash - )))) - } -} - -#[cfg(test)] -mod tests { - use mithril_common::entities::CertificateSignature; - use mithril_common::messages::CertificateMetadataMessagePart; - use mithril_common::test_utils::fake_data; - - use crate::aggregator_client::MockAggregatorHTTPClient; - - use super::*; - - #[tokio::test] - async fn test_show_ok_some() { - let mut http_client = MockAggregatorHTTPClient::new(); - let certificate_hash = "cert-hash-123".to_string(); - let certificate = fake_data::certificate(certificate_hash.clone()); - let expected_certificate = certificate.clone(); - let previous_hash = certificate.previous_hash.clone(); - http_client - .expect_get_content() - .return_once(move |_| { - let (multi_signature, genesis_signature) = match certificate.signature { - CertificateSignature::GenesisSignature(signature) => { - (String::new(), signature.try_into().unwrap()) - } - CertificateSignature::MultiSignature(signature) => { - (signature.to_json_hex().unwrap(), String::new()) - } - }; - - let message = CertificateMessage { - hash: certificate_hash.clone(), - previous_hash: previous_hash.clone(), - beacon: certificate.beacon.clone(), - metadata: CertificateMetadataMessagePart { - protocol_version: certificate.metadata.protocol_version.clone(), - protocol_parameters: certificate.metadata.protocol_parameters.clone(), - initiated_at: certificate.metadata.initiated_at, - sealed_at: certificate.metadata.sealed_at, - signers: certificate.metadata.signers.clone(), - }, - protocol_message: certificate.protocol_message.clone(), - signed_message: certificate.signed_message.clone(), - aggregate_verification_key: certificate - .aggregate_verification_key - .try_into() - .unwrap(), - multi_signature, - genesis_signature, - }; - Ok(serde_json::to_string(&message).unwrap()) - }) - .times(1); - - let certificate_client = CertificateClient::new(Arc::new(http_client)); - let cert = certificate_client - .get("cert-hash-123") - .await - .unwrap() - .expect("The certificate should be found"); - - assert_eq!(expected_certificate, cert); - } - - #[tokio::test] - async fn test_show_ok_none() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .return_once(move |_| { - Err(AggregatorHTTPClientError::RemoteServerLogical(anyhow!( - "an error" - ))) - }) - .times(1); - - let certificate_client = CertificateClient::new(Arc::new(http_client)); - assert!(certificate_client - .get("cert-hash-123") - .await - .unwrap() - .is_none()); - } - - #[tokio::test] - async fn test_show_ko() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .return_once(move |_| { - Err(AggregatorHTTPClientError::RemoteServerTechnical(anyhow!( - "an error" - ))) - }) - .times(1); - - let certificate_client = CertificateClient::new(Arc::new(http_client)); - certificate_client - .get("cert-hash-123") - .await - .expect_err("The certificate client should fail here."); - } -} diff --git a/mithril-client-cli/src/aggregator_client/http_client.rs b/mithril-client-cli/src/aggregator_client/http_client.rs deleted file mode 100644 index 46ab65a7800..00000000000 --- a/mithril-client-cli/src/aggregator_client/http_client.rs +++ /dev/null @@ -1,312 +0,0 @@ -use anyhow::anyhow; -use async_recursion::async_recursion; -use async_trait::async_trait; -use futures::StreamExt; -use reqwest::{Client, Response, StatusCode}; -use semver::Version; -use slog_scope::debug; -use std::{path::Path, sync::Arc}; -use thiserror::Error; -use tokio::sync::RwLock; - -#[cfg(test)] -use mockall::automock; - -use mithril_common::{ - entities::CompressionAlgorithm, StdError, StdResult, MITHRIL_API_VERSION_HEADER, -}; - -use crate::utils::{DownloadProgressReporter, SnapshotUnpacker}; - -/// Error tied with the Aggregator client -#[derive(Error, Debug)] -pub enum AggregatorHTTPClientError { - /// Error raised when querying the aggregator returned a 5XX error. - #[error("remote server technical error")] - RemoteServerTechnical(#[source] StdError), - - /// Error raised when querying the aggregator returned a 4XX error. - #[error("remote server logical error")] - RemoteServerLogical(#[source] StdError), - - /// Error raised when the server API version mismatch the client API version. - #[error("API version mismatch")] - ApiVersionMismatch(#[source] StdError), - - /// HTTP subsystem error - #[error("HTTP subsystem error")] - SubsystemError(#[source] StdError), -} - -/// API that defines a client for the Aggregator -#[async_trait] -pub trait AggregatorClient: Sync + Send { - /// Get the content back from the Aggregator, the URL is a relative path for a resource - async fn get_content(&self, url: &str) -> Result; - - /// Post information to the Aggregator, the URL is a relative path for a resource - async fn post_content( - &self, - url: &str, - json: &str, - ) -> Result; - - /// Download and unpack large archives on the disk - async fn download_unpack( - &self, - url: &str, - target_dir: &Path, - compression_algorithm: CompressionAlgorithm, - progress_reporter: DownloadProgressReporter, - ) -> Result<(), AggregatorHTTPClientError>; - - /// Test if the given URL points to a valid location & existing content. - async fn probe(&self, url: &str) -> Result<(), AggregatorHTTPClientError>; -} - -/// Responsible of HTTP transport and API version check. -pub struct AggregatorHTTPClient { - aggregator_endpoint: String, - api_versions: Arc>>, -} - -impl AggregatorHTTPClient { - /// AggregatorHTTPClient factory - pub fn new(aggregator_endpoint: &str, api_versions: Vec) -> Self { - debug!("New AggregatorHTTPClient created"); - Self { - aggregator_endpoint: aggregator_endpoint.to_owned(), - api_versions: Arc::new(RwLock::new(api_versions)), - } - } - - /// Computes the current api version - async fn compute_current_api_version(&self) -> Option { - self.api_versions.read().await.first().cloned() - } - - /// Discards the current api version - /// It discards the current version if and only if there is at least 2 versions available - async fn discard_current_api_version(&self) -> Option { - if self.api_versions.read().await.len() < 2 { - return None; - } - if let Some(current_api_version) = self.compute_current_api_version().await { - let mut api_versions = self.api_versions.write().await; - if let Some(index) = api_versions - .iter() - .position(|value| *value == current_api_version) - { - api_versions.remove(index); - return Some(current_api_version); - } - } - None - } - - /// Perform a HTTP GET request on the Aggregator and return the given JSON - #[async_recursion] - async fn get(&self, url: &str) -> Result { - debug!("GET url='{url}'."); - let request_builder = Client::new().get(url.to_owned()); - let current_api_version = self - .compute_current_api_version() - .await - .unwrap() - .to_string(); - debug!("Prepare request with version: {current_api_version}"); - let request_builder = - request_builder.header(MITHRIL_API_VERSION_HEADER, current_api_version); - let response = request_builder.send().await.map_err(|e| { - AggregatorHTTPClientError::SubsystemError(anyhow!(e).context(format!( - "Cannot perform a GET against the Aggregator HTTP server (url='{url}')" - ))) - })?; - - match response.status() { - StatusCode::OK => Ok(response), - StatusCode::PRECONDITION_FAILED => { - if self.discard_current_api_version().await.is_some() - && !self.api_versions.read().await.is_empty() - { - return self.get(url).await; - } - - Err(self.handle_api_error(&response).await) - } - StatusCode::NOT_FOUND => Err(AggregatorHTTPClientError::RemoteServerLogical(anyhow!( - "Url='{url} not found" - ))), - status_code => Err(AggregatorHTTPClientError::RemoteServerTechnical(anyhow!( - "Unhandled error {status_code}" - ))), - } - } - - /// Issue a POST HTTP request. - #[async_recursion] - async fn post(&self, url: &str, json: &str) -> Result { - debug!("POST url='{url}' json='{json}'."); - let request_builder = Client::new().post(url.to_owned()).body(json.to_owned()); - let current_api_version = self - .compute_current_api_version() - .await - .unwrap() - .to_string(); - debug!("Prepare request with version: {current_api_version}"); - let request_builder = - request_builder.header(MITHRIL_API_VERSION_HEADER, current_api_version); - - let response = request_builder.send().await.map_err(|e| { - AggregatorHTTPClientError::SubsystemError( - anyhow!(e).context("Error while POSTing data '{json}' to URL='{url}'."), - ) - })?; - - match response.status() { - StatusCode::OK | StatusCode::CREATED => Ok(response), - StatusCode::PRECONDITION_FAILED => { - if self.discard_current_api_version().await.is_some() - && !self.api_versions.read().await.is_empty() - { - return self.post(url, json).await; - } - - Err(self.handle_api_error(&response).await) - } - StatusCode::NOT_FOUND => Err(AggregatorHTTPClientError::RemoteServerLogical(anyhow!( - "Url='{url} not found" - ))), - status_code => Err(AggregatorHTTPClientError::RemoteServerTechnical(anyhow!( - "Unhandled error {status_code}" - ))), - } - } - - /// API version error handling - async fn handle_api_error(&self, response: &Response) -> AggregatorHTTPClientError { - if let Some(version) = response.headers().get(MITHRIL_API_VERSION_HEADER) { - AggregatorHTTPClientError::ApiVersionMismatch(anyhow!( - "server version: '{}', signer version: '{}'", - version.to_str().unwrap(), - self.compute_current_api_version().await.unwrap() - )) - } else { - AggregatorHTTPClientError::ApiVersionMismatch(anyhow!( - "version precondition failed, sent version '{}'.", - self.compute_current_api_version().await.unwrap() - )) - } - } -} - -#[cfg_attr(test, automock)] -#[async_trait] -impl AggregatorClient for AggregatorHTTPClient { - async fn get_content(&self, url: &str) -> Result { - let url = format!("{}/{}", self.aggregator_endpoint.trim_end_matches('/'), url); - let response = self.get(&url).await?; - let content = format!("{response:?}"); - - response.text().await.map_err(|e| { - AggregatorHTTPClientError::SubsystemError(anyhow!(e).context(format!( - "Could not find a JSON body in the response '{content}'." - ))) - }) - } - - async fn post_content( - &self, - url: &str, - json: &str, - ) -> Result { - let url = format!("{}/{}", self.aggregator_endpoint.trim_end_matches('/'), url); - let response = self.post(&url, json).await?; - - response.text().await.map_err(|e| { - AggregatorHTTPClientError::SubsystemError( - anyhow!(e).context("Could not find a text body in the response."), - ) - }) - } - - async fn download_unpack( - &self, - url: &str, - target_dir: &Path, - compression_algorithm: CompressionAlgorithm, - progress_reporter: DownloadProgressReporter, - ) -> Result<(), AggregatorHTTPClientError> { - if !target_dir.is_dir() { - Err(AggregatorHTTPClientError::SubsystemError( - anyhow!("target path is not a directory or does not exist: `{target_dir:?}`") - .context("Download-Unpack: prerequisite error"), - ))?; - } - - let mut downloaded_bytes: u64 = 0; - let mut remote_stream = self.get(url).await?.bytes_stream(); - let (sender, receiver) = flume::bounded(5); - - let dest_dir = target_dir.to_path_buf(); - let unpack_thread = tokio::task::spawn_blocking(move || -> StdResult<()> { - let unpacker = SnapshotUnpacker; - unpacker.unpack_snapshot(receiver, compression_algorithm, &dest_dir) - }); - - while let Some(item) = remote_stream.next().await { - let chunk = item.map_err(|e| { - AggregatorHTTPClientError::RemoteServerTechnical(anyhow!( - "Download: Could not read from byte stream: {e}" - )) - })?; - - sender.send_async(chunk.to_vec()).await.map_err(|e| { - AggregatorHTTPClientError::SubsystemError(anyhow!(e).context(format!( - "Download: could not write {} bytes to stream.", - chunk.len() - ))) - })?; - - downloaded_bytes += chunk.len() as u64; - progress_reporter.report(downloaded_bytes); - } - - drop(sender); // Signal EOF - unpack_thread - .await - .map_err(|join_error| { - AggregatorHTTPClientError::SubsystemError(anyhow!(join_error).context(format!( - "Unpack: panic while unpacking to dir '{}'", - target_dir.display() - ))) - })? - .map_err(|unpack_error| { - AggregatorHTTPClientError::SubsystemError(anyhow!(unpack_error).context(format!( - "Unpack: could not unpack to dir '{}'", - target_dir.display() - ))) - })?; - - Ok(()) - } - - async fn probe(&self, url: &str) -> Result<(), AggregatorHTTPClientError> { - debug!("HEAD url='{url}'."); - let request_builder = Client::new().head(url.to_owned()); - let response = request_builder.send().await.map_err(|e| { - AggregatorHTTPClientError::SubsystemError( - anyhow!(e).context("Cannot perform a HEAD for url='{url}'"), - ) - })?; - match response.status() { - StatusCode::OK => Ok(()), - StatusCode::NOT_FOUND => Err(AggregatorHTTPClientError::RemoteServerLogical(anyhow!( - "Url='{url} not found" - ))), - status_code => Err(AggregatorHTTPClientError::RemoteServerTechnical(anyhow!( - "Unhandled error {status_code}" - ))), - } - } -} diff --git a/mithril-client-cli/src/aggregator_client/mithril_stake_distribution_client.rs b/mithril-client-cli/src/aggregator_client/mithril_stake_distribution_client.rs deleted file mode 100644 index 2dfac881405..00000000000 --- a/mithril-client-cli/src/aggregator_client/mithril_stake_distribution_client.rs +++ /dev/null @@ -1,135 +0,0 @@ -use std::sync::Arc; - -use anyhow::Context; -use mithril_common::{ - entities::{MithrilStakeDistribution, SignedEntity}, - messages::{MithrilStakeDistributionListItemMessage, MithrilStakeDistributionListMessage}, - messages::{MithrilStakeDistributionMessage, TryFromMessageAdapter}, - StdResult, -}; - -use crate::message_adapters::FromMithrilStakeDistributionMessageAdapter; - -use super::{AggregatorClient, AggregatorHTTPClientError}; - -/// HTTP client for MithrilStakeDistribution API from the Aggregator -pub struct MithrilStakeDistributionClient { - http_client: Arc, -} - -impl MithrilStakeDistributionClient { - /// Constructor - pub fn new(http_client: Arc) -> Self { - Self { http_client } - } - - /// Fetch a list of signed MithrilStakeDistribution - pub async fn list(&self) -> StdResult> { - let url = "artifact/mithril-stake-distributions"; - let response = self.http_client.get_content(url).await.with_context(|| { - format!("MithrilStakeDistribution Client can not get the artifact list at '{url}'") - })?; - let items = serde_json::from_str::(&response) - .with_context(|| "MithrilStakeDistribution Client can not deserialize artifact list")?; - - Ok(items) - } - - /// Download the given stake distribution. If it cannot be found, a None is returned. - pub async fn get( - &self, - hash: &str, - ) -> StdResult>> { - let url = format!("artifact/mithril-stake-distribution/{hash}"); - - match self.http_client.get_content(&url).await { - Ok(content) => { - let message: MithrilStakeDistributionMessage = serde_json::from_str(&content).with_context(|| format!("MithrilStakeDistribution Client can not deserialize artifact at '{url}'"))?; - let stake_distribution_entity = - FromMithrilStakeDistributionMessageAdapter::try_adapt(message).with_context(|| format!("MithrilStakeDistribution Client can not parse stake distribution artifact from message, certificate hash: '{hash:?}'"))?; - - Ok(Some(stake_distribution_entity)) - } - Err(AggregatorHTTPClientError::RemoteServerLogical(_)) => Ok(None), - Err(e) => Err(e.into()), - } - } -} - -#[cfg(test)] -mod tests { - use chrono::{DateTime, Utc}; - use mithril_common::{ - entities::Epoch, messages::SignerWithStakeMessagePart, test_utils::fake_data, - }; - - use crate::aggregator_client::MockAggregatorHTTPClient; - - use super::*; - - fn golden_message() -> MithrilStakeDistributionListMessage { - vec![ - MithrilStakeDistributionListItemMessage { - epoch: Epoch(1), - hash: "hash-123".to_string(), - certificate_hash: "cert-hash-123".to_string(), - created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") - .unwrap() - .with_timezone(&Utc), - }, - MithrilStakeDistributionListItemMessage { - epoch: Epoch(2), - hash: "hash-456".to_string(), - certificate_hash: "cert-hash-456".to_string(), - created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") - .unwrap() - .with_timezone(&Utc), - }, - ] - } - - #[tokio::test] - async fn get_mithril_stake_distribution_list() { - let message = golden_message(); - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .return_once(move |_| Ok(serde_json::to_string(&message).unwrap())); - let client = MithrilStakeDistributionClient::new(Arc::new(http_client)); - let items = client.list().await.unwrap(); - - assert_eq!(2, items.len()); - assert_eq!("hash-123".to_string(), items[0].hash); - assert_eq!("hash-456".to_string(), items[1].hash); - } - - #[tokio::test] - async fn get_mithril_stake_distribution() { - let mut http_client = MockAggregatorHTTPClient::new(); - let message = MithrilStakeDistributionMessage { - certificate_hash: "certificate-hash-123".to_string(), - epoch: Epoch(1), - signers_with_stake: SignerWithStakeMessagePart::from_signers( - fake_data::signers_with_stakes(2), - ), - hash: "hash".to_string(), - created_at: DateTime::::default(), - protocol_parameters: fake_data::protocol_parameters(), - }; - http_client - .expect_get_content() - .return_once(move |_| Ok(serde_json::to_string(&message).unwrap())); - let client = MithrilStakeDistributionClient::new(Arc::new(http_client)); - let stake_distribution_entity = client - .get("hash") - .await - .unwrap() - .expect("This test returns a stake distribution"); - - assert_eq!("hash".to_string(), stake_distribution_entity.artifact.hash); - assert_eq!( - 2, - stake_distribution_entity.artifact.signers_with_stake.len(), - ); - } -} diff --git a/mithril-client-cli/src/aggregator_client/mod.rs b/mithril-client-cli/src/aggregator_client/mod.rs deleted file mode 100644 index c018d0253bb..00000000000 --- a/mithril-client-cli/src/aggregator_client/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -//! Transport layers to the Aggregator nodes -mod certificate_client; -mod http_client; -mod mithril_stake_distribution_client; -mod snapshot_client; - -pub use certificate_client::*; -pub use http_client::*; -pub use mithril_stake_distribution_client::*; -pub use snapshot_client::*; diff --git a/mithril-client-cli/src/aggregator_client/snapshot_client.rs b/mithril-client-cli/src/aggregator_client/snapshot_client.rs deleted file mode 100644 index 11552f7476d..00000000000 --- a/mithril-client-cli/src/aggregator_client/snapshot_client.rs +++ /dev/null @@ -1,125 +0,0 @@ -//! This module contains a struct to exchange snapshot information with the Aggregator - -use anyhow::Context; -use slog_scope::warn; -use std::{path::Path, sync::Arc}; -use thiserror::Error; - -use mithril_common::{ - entities::Snapshot, - messages::{SnapshotListItemMessage, SnapshotListMessage, SnapshotMessage, ToMessageAdapter}, - StdResult, -}; - -use crate::utils::DownloadProgressReporter; -use crate::{ - aggregator_client::AggregatorClient, message_adapters::ToSnapshotDownloadMessageAdapter, -}; - -/// Error for the Snapshot client -#[derive(Error, Debug)] -pub enum SnapshotClientError { - /// Download location does not work - #[error("Could not find a working download location for the snapshot digest '{digest}', tried location: {{'{locations}'}}.")] - NoWorkingLocation { - /// given digest - digest: String, - - /// list of locations tried - locations: String, - }, -} - -/// Aggregator client for the snapshot artifact -pub struct SnapshotClient { - http_client: Arc, -} - -impl SnapshotClient { - /// constructor - pub fn new(http_client: Arc) -> Self { - Self { http_client } - } - - /// Return a list of available snapshots - pub async fn list(&self) -> StdResult> { - let url = "artifact/snapshots"; - let response = - self.http_client.get_content(url).await.with_context(|| { - format!("Snapshot Client can not get the artifact list at '{url}'") - })?; - let items = serde_json::from_str::(&response) - .with_context(|| "Snapshot Client can not deserialize artifact list")?; - - Ok(items) - } - - /// Return a snapshot based on the given digest (list to get the digests) - pub async fn show(&self, digest: &str) -> StdResult { - let url = format!("artifact/snapshot/{}", digest); - let response = self - .http_client - .get_content(&url) - .await - .with_context(|| format!("Snapshot Client can not get the artifact at '{url}'"))?; - let message = serde_json::from_str::(&response).with_context(|| { - format!("Snapshot Client can not deserialize artifact for digest '{digest}'") - })?; - - Ok(message) - } - - /// Download and unpack the given snapshot to the given directory - pub async fn download_unpack( - &self, - snapshot: &Snapshot, - target_dir: &Path, - progress_reporter: DownloadProgressReporter, - ) -> StdResult<()> { - for url in snapshot.locations.as_slice() { - if self.http_client.probe(url).await.is_ok() { - return match self - .http_client - .download_unpack( - url, - target_dir, - snapshot.compression_algorithm, - progress_reporter, - ) - .await - { - Ok(()) => { - // the snapshot download does not fail if the statistic call fails. - if let Err(e) = self.add_statistics(snapshot).await { - warn!("Could not POST snapshot download statistics: {e:?}"); - } - - Ok(()) - } - Err(e) => { - warn!("Failed downloading snapshot from '{url}' Error: {e}."); - Err(e.into()) - } - }; - } - } - - let locations = snapshot.locations.join(", "); - - Err(SnapshotClientError::NoWorkingLocation { - digest: snapshot.digest.clone(), - locations, - } - .into()) - } - - /// Increments Aggregator's download statistics - pub async fn add_statistics(&self, snapshot: &Snapshot) -> StdResult<()> { - let url = "statistics/snapshot"; - let snapshot_download_message = ToSnapshotDownloadMessageAdapter::adapt(snapshot); - let json = serde_json::to_string(&snapshot_download_message)?; - let _response = self.http_client.post_content(url, &json).await?; - - Ok(()) - } -} diff --git a/mithril-client-cli/src/client.rs b/mithril-client-cli/src/client.rs deleted file mode 100644 index 0c73e0343a2..00000000000 --- a/mithril-client-cli/src/client.rs +++ /dev/null @@ -1,145 +0,0 @@ -//! Client module -//! -//! The client wraps the initialization of the Mithril Client services and provides a simple API for the library -//! -//! ```no_run -//! use mithril_client_cli::client::Client; -//! use mithril_client_cli::common::*; -//! -//! #[tokio::main] -//! async fn main() -> StdResult<()> { -//! let client = Client::new("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").await?; -//! let snapshot = client.show_snapshot("5a1288f7164bec049f34e46002e939f4c609a0ddf86636fdc4180ea22342cab7").await?; -//! -//! println!("Snapshot id={}, size={}", snapshot.digest, snapshot.size); -//! -//! Ok(()) -//! } -//! ``` -//! -use std::sync::Arc; - -use crate::dependencies::{ConfigParameters, DependenciesBuilder}; -use anyhow::Context; - -use crate::common::*; -use crate::services::{MithrilStakeDistributionService, SnapshotService}; -/// Client structure that instanciates required dependencies -pub struct Client { - snapshot_service: Arc, - mithril_stake_distribution_service: Arc, -} - -impl Client { - /// Client constructor - pub async fn new(aggregator_endpoint: &str, genesis_verification_key: &str) -> StdResult { - let mut config = ConfigParameters::default(); - config - .add_parameter("genesis_verification_key", genesis_verification_key) - .add_parameter("aggregator_endpoint", aggregator_endpoint); - let mut dependencies_builder = DependenciesBuilder::new(Arc::new(config)); - let snapshot_service = dependencies_builder - .get_snapshot_service() - .await - .with_context(|| "Cannot instantiate Client")?; - let mithril_stake_distribution_service = dependencies_builder - .get_mithril_stake_distribution_service() - .await - .with_context(|| "Cannot instantiate Client")?; - - Ok(Self { - snapshot_service, - mithril_stake_distribution_service, - }) - } - - /// Call the snapshot service to get a snapshot message from a digest - pub async fn show_snapshot(&self, digest: &str) -> StdResult { - self.snapshot_service.show(digest).await - } - - /// Call the snapshot service to get the list of available snapshots - pub async fn list_snapshots(&self) -> StdResult> { - self.snapshot_service.list().await - } - - /// Call the mithril stake distribution service for the list of available mithril stake distributions - pub async fn list_mithril_stake_distributions( - &self, - ) -> StdResult { - self.mithril_stake_distribution_service.list().await - } -} - -#[cfg(test)] -mod tests { - use warp::{self, Filter}; - - use mithril_common::{ - messages::MithrilStakeDistributionListItemMessage, - test_utils::test_http_server::test_http_server, - }; - - use super::*; - - #[tokio::test] - async fn show_snapshot() -> StdResult<()> { - let snapshot_message = SnapshotMessage::dummy(); - let json_snapshot_message = serde_json::to_string(&snapshot_message)?; - let http_server = test_http_server( - warp::path!("artifact" / "snapshot" / String) - .map(move |_digest| json_snapshot_message.clone()), - ); - let client = Client::new(&http_server.url(), "WRITE THE VKEY HERE").await?; - let response = client.show_snapshot(&snapshot_message.digest).await?; - - assert_eq!(snapshot_message, response); - - Ok(()) - } - - #[tokio::test] - async fn list_snapshots() -> StdResult<()> { - let snapshot_list_message = vec![ - SnapshotListItemMessage::dummy(), - SnapshotListItemMessage { - digest: "0b107cafc5638403cc523775c82249294eb8a1541d54f08eb3ec7c69f5ad7f33" - .to_string(), - ..SnapshotListItemMessage::dummy() - }, - ]; - let json_snapshot_list_message = serde_json::to_string(&snapshot_list_message)?; - let http_server = test_http_server( - warp::path!("artifact" / "snapshots").map(move || json_snapshot_list_message.clone()), - ); - let client = Client::new(&http_server.url(), "WRITE THE VKEY HERE").await?; - let response = client.list_snapshots().await?; - - assert_eq!(snapshot_list_message, response); - - Ok(()) - } - - #[tokio::test] - async fn list_mithril_stake_distribution() -> StdResult<()> { - let mithril_stake_distribution_list_message: MithrilStakeDistributionListMessage = vec![ - MithrilStakeDistributionListItemMessage::dummy(), - MithrilStakeDistributionListItemMessage { - hash: "12345".to_string(), - ..MithrilStakeDistributionListItemMessage::dummy() - }, - ]; - let mithril_stake_distribution_list_message_json = - serde_json::to_string(&mithril_stake_distribution_list_message)?; - let http_server = test_http_server( - warp::path!("artifact" / "mithril-stake-distributions") - .map(move || mithril_stake_distribution_list_message_json.clone()), - ); - let client = Client::new(&http_server.url(), "WRITE THE VKEY HERE").await?; - let response = client.list_mithril_stake_distributions().await?; - - assert_eq!(mithril_stake_distribution_list_message, response); - - Ok(()) - } -} diff --git a/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs b/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs index 38e3dcebc0d..23fabbd192c 100644 --- a/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs +++ b/mithril-client-cli/src/commands/mithril_stake_distribution/download.rs @@ -1,16 +1,17 @@ +use anyhow::Context; +use clap::Parser; +use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind}; +use slog_scope::logger; use std::{ collections::HashMap, path::{Path, PathBuf}, sync::Arc, }; -use anyhow::Context; -use clap::Parser; -use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind}; +use crate::{configuration::ConfigParameters, utils::ExpanderUtils}; +use mithril_client::{ClientBuilder, MessageBuilder}; use mithril_common::StdResult; -use mithril_client_cli::dependencies::{ConfigParameters, DependenciesBuilder}; - /// Download and verify a Mithril Stake Distribution information. If the /// verification fails, the file is not persisted. #[derive(Parser, Debug, Clone)] @@ -38,31 +39,87 @@ impl MithrilStakeDistributionDownloadCommand { .set_default("download_dir", ".")? .add_source(self.clone()) .build()?; - let params: Arc = Arc::new(ConfigParameters::new( + let params = Arc::new(ConfigParameters::new( config.try_deserialize::>()?, )); - let mut dependencies_builder = DependenciesBuilder::new(params.clone()); - let service = dependencies_builder - .get_mithril_stake_distribution_service() - .await - .with_context(|| { - "Dependencies Builder can not get Mithril Stake Distribution Service" + let download_dir = ¶ms.require("download_dir")?; + let download_dir = Path::new(download_dir); + let client = ClientBuilder::aggregator( + ¶ms.require("aggregator_endpoint")?, + ¶ms.require("genesis_verification_key")?, + ) + .with_logger(logger()) + .build()?; + + let get_list_of_artifact_ids = || async { + let mithril_stake_distributions = client.mithril_stake_distribution().list().await.with_context(|| { + "Can not get the list of artifacts while retrieving the latest stake distribution hash" })?; - let filepath = service - .download( - &self.artifact_hash, - Path::new(¶ms.require("download_dir")?), - ¶ms.require("genesis_verification_key")?, + Ok(mithril_stake_distributions + .iter() + .map(|msd| msd.hash.to_owned()) + .collect::>()) + }; + let mithril_stake_distribution = client + .mithril_stake_distribution() + .get( + &ExpanderUtils::expand_eventual_id_alias( + &self.artifact_hash, + get_list_of_artifact_ids(), + ) + .await?, ) - .await + .await? .with_context(|| { format!( - "Mithril Stake Distribution Service can not download and verify the artifact for hash: '{}'", + "Can not download and verify the artifact for hash: '{}'", self.artifact_hash ) })?; + let certificate = client + .certificate() + .verify_chain(&mithril_stake_distribution.certificate_hash) + .await + .with_context(|| { + format!( + "Can not verify the certificate chain from certificate_hash: '{}'", + &mithril_stake_distribution.certificate_hash + ) + })?; + + let message = MessageBuilder::new() + .compute_mithril_stake_distribution_message(&mithril_stake_distribution) + .with_context(|| { + "Can not compute the message for the given Mithril stake distribution" + })?; + + if !certificate.match_message(&message) { + return Err(anyhow::anyhow!( + "Certificate and message did not match:\ncertificate_message: '{}'\n computed_message: '{}'", + certificate.signed_message, + message.compute_hash() + )); + } + + if !download_dir.is_dir() { + std::fs::create_dir_all(download_dir)?; + } + let filepath = PathBuf::new().join(download_dir).join(format!( + "mithril_stake_distribution-{}.json", + mithril_stake_distribution.hash + )); + std::fs::write( + &filepath, + serde_json::to_string(&mithril_stake_distribution).with_context(|| { + format!( + "Can not serialize stake distribution artifact '{:?}'", + mithril_stake_distribution + ) + })?, + )?; + println!( "Mithril Stake Distribution '{}' has been verified and saved as '{}'.", self.artifact_hash, diff --git a/mithril-client-cli/src/commands/mithril_stake_distribution/list.rs b/mithril-client-cli/src/commands/mithril_stake_distribution/list.rs index bd7b672792e..3031800109a 100644 --- a/mithril-client-cli/src/commands/mithril_stake_distribution/list.rs +++ b/mithril-client-cli/src/commands/mithril_stake_distribution/list.rs @@ -1,12 +1,12 @@ -use std::{collections::HashMap, sync::Arc}; - -use anyhow::Context; use clap::Parser; use cli_table::{format::Justify, print_stdout, Cell, Table}; use config::{builder::DefaultState, ConfigBuilder}; -use mithril_common::StdResult; +use slog_scope::logger; +use std::{collections::HashMap, sync::Arc}; -use mithril_client_cli::dependencies::{ConfigParameters, DependenciesBuilder}; +use crate::configuration::ConfigParameters; +use mithril_client::ClientBuilder; +use mithril_common::{test_utils::fake_keys, StdResult}; /// Mithril stake distribution LIST command #[derive(Parser, Debug, Clone)] @@ -20,19 +20,23 @@ impl MithrilStakeDistributionListCommand { /// Main command execution pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { let config = config_builder.build()?; - let params: Arc = Arc::new(ConfigParameters::new( + let params = Arc::new(ConfigParameters::new( config.try_deserialize::>()?, )); - let mut dependencies_builder = DependenciesBuilder::new(params); - let service = dependencies_builder - .get_mithril_stake_distribution_service() - .await - .with_context(|| { - "Dependencies Builder can not get Mithril Stake Distribution Service" - })?; - let lines = service.list().await.with_context(|| { - "Mithril Stake Distribution Service can not get the list of artifacts" - })?; + // TODO: This should not be done this way. + // Now that mithril-client-cli uses the mithril-client library, the genesis verification key is required for all commands + let fallback_genesis_verification_key = + fake_keys::genesis_verification_key()[0].to_string(); + let client = ClientBuilder::aggregator( + ¶ms.require("aggregator_endpoint")?, + ¶ms.get_or( + "genesis_verification_key", + &fallback_genesis_verification_key, + ), + ) + .with_logger(logger()) + .build()?; + let lines = client.mithril_stake_distribution().list().await?; if self.json { println!("{}", serde_json::to_string(&lines)?); diff --git a/mithril-client-cli/src/commands/snapshot/download.rs b/mithril-client-cli/src/commands/snapshot/download.rs index f64aee4e0e8..9b9c57aeba6 100644 --- a/mithril-client-cli/src/commands/snapshot/download.rs +++ b/mithril-client-cli/src/commands/snapshot/download.rs @@ -1,19 +1,26 @@ -use anyhow::Context; +use anyhow::{anyhow, Context}; +use chrono::Utc; use clap::Parser; use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind}; +use slog_scope::{debug, logger, warn}; use std::{ collections::HashMap, + fs::File, path::{Path, PathBuf}, sync::Arc, }; -use mithril_common::{messages::FromMessageAdapter, StdResult}; - -use mithril_client_cli::{ - dependencies::{ConfigParameters, DependenciesBuilder}, - utils::ProgressOutputType, - FromSnapshotMessageAdapter, +use crate::{ + configuration::ConfigParameters, + utils::{ + ExpanderUtils, IndicatifFeedbackReceiver, ProgressOutputType, ProgressPrinter, + SnapshotUnpacker, SnapshotUtils, + }, +}; +use mithril_client::{ + common::ProtocolMessage, Client, ClientBuilder, MessageBuilder, MithrilCertificate, Snapshot, }; +use mithril_common::StdResult; /// Clap command to download the snapshot and verify the certificate. #[derive(Parser, Debug, Clone)] @@ -41,71 +48,250 @@ pub struct SnapshotDownloadCommand { impl SnapshotDownloadCommand { /// Command execution pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { + debug!("Snapshot service: download."); let config = config_builder.add_source(self.clone()).build()?; - let params: Arc = Arc::new(ConfigParameters::new( + let params = Arc::new(ConfigParameters::new( config.try_deserialize::>()?, )); - let mut dependencies_builder = DependenciesBuilder::new(params.clone()); - let snapshot_service = dependencies_builder - .get_snapshot_service() - .await - .with_context(|| "Dependencies Builder can not get Snapshot Service")?; - let snapshot_entity = FromSnapshotMessageAdapter::adapt( - snapshot_service.show(&self.digest).await.with_context(|| { - format!( - "Snapshot Service can not get the snapshot for digest: '{}'", - self.digest - ) - })?, - ); + let download_dir: &String = ¶ms.require("download_dir")?; + let db_dir = Path::new(download_dir).join("db"); + let progress_output_type = if self.json { ProgressOutputType::JsonReporter } else { - ProgressOutputType::TTY + ProgressOutputType::Tty }; - let filepath = snapshot_service - .download( - &snapshot_entity, - Path::new(¶ms.require("download_dir")?), - ¶ms.require("genesis_verification_key")?, - progress_output_type, + let progress_printer = ProgressPrinter::new(progress_output_type, 5); + let client = ClientBuilder::aggregator( + ¶ms.require("aggregator_endpoint")?, + ¶ms.require("genesis_verification_key")?, + ) + .with_logger(logger()) + .add_feedback_receiver(Arc::new(IndicatifFeedbackReceiver::new( + progress_output_type, + ))) + .build()?; + + let get_list_of_artifact_ids = || async { + let snapshots = client.snapshot().list().await.with_context(|| { + "Can not get the list of artifacts while retrieving the latest snapshot digest" + })?; + + Ok(snapshots + .iter() + .map(|snapshot| snapshot.digest.to_owned()) + .collect::>()) + }; + + let snapshot_message = client + .snapshot() + .get( + &ExpanderUtils::expand_eventual_id_alias(&self.digest, get_list_of_artifact_ids()) + .await?, + ) + .await? + .with_context(|| format!("Can not get the snapshot for digest: '{}'", self.digest))?; + + Self::check_local_disk_info(1, &progress_printer, &db_dir, &snapshot_message)?; + + let certificate = Self::fetch_certificate_and_verifying_chain( + 2, + &progress_printer, + &client, + &snapshot_message.certificate_hash, + ) + .await?; + + Self::download_and_unpack_snapshot( + 3, + &progress_printer, + &client, + &snapshot_message, + &db_dir, + ) + .await + .with_context(|| { + format!( + "Can not get download and unpack snapshot for digest: '{}'", + self.digest ) + })?; + + let message = + Self::compute_snapshot_message(4, &progress_printer, &certificate, &db_dir).await?; + + Self::verify_snapshot_signature( + 5, + &progress_printer, + &certificate, + &message, + &snapshot_message, + ) + .await?; + + Self::log_download_information(&db_dir, &snapshot_message, self.json)?; + + Ok(()) + } + + fn check_local_disk_info( + step_number: u16, + progress_printer: &ProgressPrinter, + db_dir: &PathBuf, + snapshot: &Snapshot, + ) -> StdResult<()> { + progress_printer.report_step(step_number, "Checking local disk info…")?; + if let Err(e) = SnapshotUnpacker::check_prerequisites( + db_dir, + snapshot.size, + snapshot.compression_algorithm.unwrap_or_default(), + ) { + progress_printer + .report_step(step_number, &SnapshotUtils::check_disk_space_error(e)?)?; + } + + std::fs::create_dir_all(db_dir).with_context(|| { + format!( + "Download: could not create target directory '{}'.", + db_dir.display() + ) + })?; + + Ok(()) + } + + async fn fetch_certificate_and_verifying_chain( + step_number: u16, + progress_printer: &ProgressPrinter, + client: &Client, + certificate_hash: &str, + ) -> StdResult { + progress_printer.report_step( + step_number, + "Fetching the certificate and verifying the certificate chain…", + )?; + let certificate = client + .certificate() + .verify_chain(certificate_hash) .await .with_context(|| { format!( - "Snapshot Service can not download and verify the snapshot for digest: '{}'", - self.digest + "Can not verify the certificate chain from certificate_hash: '{}'", + certificate_hash ) })?; - let canonicalized_filepath = filepath.canonicalize().with_context(|| { + Ok(certificate) + } + + async fn download_and_unpack_snapshot( + step_number: u16, + progress_printer: &ProgressPrinter, + client: &Client, + snapshot: &Snapshot, + db_dir: &Path, + ) -> StdResult<()> { + progress_printer.report_step(step_number, "Downloading and unpacking the snapshot…")?; + client.snapshot().download_unpack(snapshot, db_dir).await?; + + // The snapshot download does not fail if the statistic call fails. + // It would be nice to implement tests to verify the behavior of `add_statistics` + if let Err(e) = client.snapshot().add_statistics(snapshot).await { + warn!("Could not increment snapshot download statistics: {e:?}"); + } + + // Append 'clean' file to speedup node bootstrap + if let Err(error) = File::create(db_dir.join("clean")) { + warn!( + "Could not create clean shutdown marker file in directory {}: {error}", + db_dir.display() + ); + }; + + Ok(()) + } + + async fn compute_snapshot_message( + step_number: u16, + progress_printer: &ProgressPrinter, + certificate: &MithrilCertificate, + db_dir: &Path, + ) -> StdResult { + progress_printer.report_step(step_number, "Computing the snapshot message")?; + let message = SnapshotUtils::wait_spinner( + progress_printer, + MessageBuilder::new().compute_snapshot_message(certificate, db_dir), + ) + .await + .with_context(|| { + format!( + "Can not compute the snapshot message from the directory: '{:?}'", + db_dir + ) + })?; + + Ok(message) + } + + async fn verify_snapshot_signature( + step_number: u16, + progress_printer: &ProgressPrinter, + certificate: &MithrilCertificate, + message: &ProtocolMessage, + snapshot: &Snapshot, + ) -> StdResult<()> { + progress_printer.report_step(step_number, "Verifying the snapshot signature…")?; + if !certificate.match_message(message) { + debug!("Digest verification failed, removing unpacked files & directory."); + + return Err(anyhow!( + "Certificate verification failed (snapshot digest = '{}').", + snapshot.digest.clone() + )); + } + + Ok(()) + } + + fn log_download_information( + db_dir: &Path, + snapshot: &Snapshot, + json_output: bool, + ) -> StdResult<()> { + let canonicalized_filepath = &db_dir.canonicalize().with_context(|| { format!( "Could not get canonicalized filepath of '{}'", - filepath.display() + db_dir.display() ) })?; - if self.json { + if json_output { println!( - r#"{{"db_directory": "{}"}}"#, + r#"{{"timestamp": "{}", "db_directory": "{}"}}"#, + Utc::now().to_rfc3339(), canonicalized_filepath.display() ); } else { + let cardano_node_version = snapshot + .cardano_node_version + .clone() + .unwrap_or("latest".to_string()); println!( r###"Snapshot '{}' has been unpacked and successfully checked against Mithril multi-signature contained in the certificate. - -Files in the directory '{}' can be used to run a Cardano node with version >= {}. - -If you are using Cardano Docker image, you can restore a Cardano Node with: - -docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="{}",target=/data/db/ -e NETWORK={} inputoutput/cardano-node:8.1.2 - -"###, - &self.digest, - filepath.display(), - snapshot_entity.artifact.cardano_node_version, + + Files in the directory '{}' can be used to run a Cardano node with version >= {}. + + If you are using Cardano Docker image, you can restore a Cardano Node with: + + docker run -v cardano-node-ipc:/ipc -v cardano-node-data:/data --mount type=bind,source="{}",target=/data/db/ -e NETWORK={} ghcr.io/intersectmbo/cardano-node:{} + + "###, + snapshot.digest, + db_dir.display(), + cardano_node_version, canonicalized_filepath.display(), - snapshot_entity.artifact.beacon.network, + snapshot.beacon.network, + cardano_node_version ); } diff --git a/mithril-client-cli/src/commands/snapshot/list.rs b/mithril-client-cli/src/commands/snapshot/list.rs index da52fd84c8b..f1697dfdf76 100644 --- a/mithril-client-cli/src/commands/snapshot/list.rs +++ b/mithril-client-cli/src/commands/snapshot/list.rs @@ -1,14 +1,12 @@ -use std::{collections::HashMap, sync::Arc}; - -use anyhow::Context; use clap::Parser; use cli_table::{format::Justify, print_stdout, Cell, Table}; - use config::{builder::DefaultState, ConfigBuilder}; -use mithril_client_cli::{ - common::StdResult, - dependencies::{ConfigParameters, DependenciesBuilder}, -}; +use slog_scope::logger; +use std::{collections::HashMap, sync::Arc}; + +use crate::configuration::ConfigParameters; +use mithril_client::ClientBuilder; +use mithril_common::{test_utils::fake_keys, StdResult}; /// Clap command to list existing snapshots #[derive(Parser, Debug, Clone)] @@ -22,18 +20,23 @@ impl SnapshotListCommand { /// Main command execution pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { let config = config_builder.build()?; - let params: Arc = Arc::new(ConfigParameters::new( + let params = Arc::new(ConfigParameters::new( config.try_deserialize::>()?, )); - let mut dependencies_builder = DependenciesBuilder::new(params); - let snapshot_service = dependencies_builder - .get_snapshot_service() - .await - .with_context(|| "Dependencies Builder can not get Snapshot Service")?; - let items = snapshot_service - .list() - .await - .with_context(|| "Snapshot Service can not get the list of snapshots")?; + // TODO: This should not be done this way. + // Now that mithril-client-cli uses the mithril-client library, the genesis verification key is required for all commands + let fallback_genesis_verification_key = + fake_keys::genesis_verification_key()[0].to_string(); + let client = ClientBuilder::aggregator( + ¶ms.require("aggregator_endpoint")?, + ¶ms.get_or( + "genesis_verification_key", + &fallback_genesis_verification_key, + ), + ) + .with_logger(logger()) + .build()?; + let items = client.snapshot().list().await?; if self.json { println!("{}", serde_json::to_string(&items)?); diff --git a/mithril-client-cli/src/commands/snapshot/show.rs b/mithril-client-cli/src/commands/snapshot/show.rs index 9dc5c8df245..65e11d611d6 100644 --- a/mithril-client-cli/src/commands/snapshot/show.rs +++ b/mithril-client-cli/src/commands/snapshot/show.rs @@ -1,12 +1,13 @@ -use anyhow::Context; +use anyhow::{anyhow, Context}; use clap::Parser; use cli_table::{print_stdout, Cell, Table}; use config::{builder::DefaultState, ConfigBuilder}; +use slog_scope::logger; use std::{collections::HashMap, sync::Arc}; -use mithril_common::StdResult; - -use mithril_client_cli::dependencies::{ConfigParameters, DependenciesBuilder}; +use crate::{configuration::ConfigParameters, utils::ExpanderUtils}; +use mithril_client::ClientBuilder; +use mithril_common::{test_utils::fake_keys, StdResult}; /// Clap command to show a given snapshot #[derive(Parser, Debug, Clone)] @@ -25,20 +26,42 @@ impl SnapshotShowCommand { /// Snapshot Show command pub async fn execute(&self, config_builder: ConfigBuilder) -> StdResult<()> { let config = config_builder.build()?; - let params: Arc = Arc::new(ConfigParameters::new( + let params = Arc::new(ConfigParameters::new( config.try_deserialize::>()?, )); - let mut dependencies_builder = DependenciesBuilder::new(params); - let snapshot_service = dependencies_builder - .get_snapshot_service() - .await - .with_context(|| "Dependencies Builder can not get Snapshot Service")?; - let snapshot_message = snapshot_service.show(&self.digest).await.with_context(|| { - format!( - "Snapshot Service can not show the snapshot for digest: '{}'", - self.digest + // TODO: This should not be done this way. + // Now that mithril-client-cli uses the mithril-client library, the genesis verification key is required for all commands + let fallback_genesis_verification_key = + fake_keys::genesis_verification_key()[0].to_string(); + let client = ClientBuilder::aggregator( + ¶ms.require("aggregator_endpoint")?, + ¶ms.get_or( + "genesis_verification_key", + &fallback_genesis_verification_key, + ), + ) + .with_logger(logger()) + .build()?; + + let get_list_of_artifact_ids = || async { + let snapshots = client.snapshot().list().await.with_context(|| { + "Can not get the list of artifacts while retrieving the latest snapshot digest" + })?; + + Ok(snapshots + .iter() + .map(|snapshot| snapshot.digest.to_owned()) + .collect::>()) + }; + + let snapshot_message = client + .snapshot() + .get( + &ExpanderUtils::expand_eventual_id_alias(&self.digest, get_list_of_artifact_ids()) + .await?, ) - })?; + .await? + .ok_or_else(|| anyhow!("Snapshot not found for digest: '{}'", &self.digest))?; if self.json { println!("{}", serde_json::to_string(&snapshot_message)?); diff --git a/mithril-client-cli/src/configuration.rs b/mithril-client-cli/src/configuration.rs new file mode 100644 index 00000000000..ac5127f6a80 --- /dev/null +++ b/mithril-client-cli/src/configuration.rs @@ -0,0 +1,122 @@ +use serde::Deserialize; +use std::collections::HashMap; +use thiserror::Error; + +/// Configuration error +#[derive(Debug, Error)] +pub enum ConfigError { + /// Error raised when a required parameter is not present. + #[error("Parameter '{0}' is mandatory.")] + Required(String), +} + +/// Configuration parameters holder +#[derive(Debug, Default, PartialEq, Deserialize)] +#[serde(default)] +pub struct ConfigParameters { + parameters: HashMap, +} + +impl ConfigParameters { + /// Constructor + pub fn new(parameters: HashMap) -> Self { + Self { parameters } + } + + /// Useful constructor for testing + #[cfg(test)] + pub fn build(parameters: &[(&str, &str)]) -> Self { + let parameters = parameters + .iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect(); + + Self::new(parameters) + } + + /// Add or replace a parameter in the holder + #[cfg(test)] + pub fn add_parameter(&mut self, name: &str, value: &str) -> &mut Self { + let _ = self.parameters.insert(name.to_string(), value.to_string()); + + self + } + + /// Fetch a parameter from the holder. + pub fn get(&self, name: &str) -> Option { + self.parameters.get(name).cloned() + } + + /// Fetch a parameter from the holder. If the parameter is not set, the + /// given default value is returned instead. + pub fn get_or(&self, name: &str, default: &str) -> String { + self.get(name).unwrap_or(default.to_string()) + } + + /// Fetch a parameter from the holder. If the parameter is not set, an error + /// is raised. + pub fn require(&self, name: &str) -> Result { + self.get(name) + .ok_or_else(|| ConfigError::Required(name.to_string())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_config_constructor() { + let config = ConfigParameters::build(&[("pika", "chu")]); + + assert_eq!( + ConfigParameters { + parameters: [("pika".to_string(), "chu".to_string())] + .into_iter() + .collect() + }, + config + ); + } + #[test] + fn test_config_set() { + let mut config = ConfigParameters::default(); + config.add_parameter("pika", "chu"); + + assert_eq!( + ConfigParameters { + parameters: [("pika".to_string(), "chu".to_string())] + .into_iter() + .collect() + }, + config + ); + } + + #[test] + fn test_config_get() { + let mut config = ConfigParameters::default(); + config.add_parameter("pika", "chu"); + + assert_eq!("chu".to_string(), config.get("pika").unwrap()); + assert!(config.get("whatever").is_none()); + } + + #[test] + fn test_config_default() { + let mut config = ConfigParameters::default(); + config.add_parameter("pika", "chu"); + + assert_eq!("chu".to_string(), config.get("pika").unwrap()); + assert_eq!("default".to_string(), config.get_or("whatever", "default")); + } + + #[test] + fn test_config_require() { + let mut config = ConfigParameters::default(); + config.add_parameter("pika", "chu"); + + assert_eq!("chu".to_string(), config.require("pika").unwrap()); + config.require("whatever").unwrap_err(); + } +} diff --git a/mithril-client-cli/src/dependencies/builder.rs b/mithril-client-cli/src/dependencies/builder.rs deleted file mode 100644 index 039d33249bc..00000000000 --- a/mithril-client-cli/src/dependencies/builder.rs +++ /dev/null @@ -1,381 +0,0 @@ -use std::{collections::HashMap, sync::Arc}; - -use anyhow::Context; -use serde::Deserialize; -use slog::Logger; - -use mithril_common::{ - api_version::APIVersionProvider, - certificate_chain::{CertificateVerifier, MithrilCertificateVerifier}, - digesters::{CardanoImmutableDigester, ImmutableDigester}, - StdResult, -}; -use thiserror::Error; - -use crate::{ - aggregator_client::{ - AggregatorClient, AggregatorHTTPClient, CertificateClient, MithrilStakeDistributionClient, - SnapshotClient, - }, - services::{ - AppMithrilStakeDistributionService, MithrilClientSnapshotService, - MithrilStakeDistributionService, SnapshotService, - }, -}; - -/// Configuration error -#[derive(Debug, Error)] -pub enum ConfigError { - /// Error raised when a required parameter is not present. - #[error("Parameter '{0}' is mandatory.")] - Required(String), -} - -/// Configuration parameters holder -#[derive(Debug, Default, PartialEq, Deserialize)] -#[serde(default)] -pub struct ConfigParameters { - parameters: HashMap, -} - -impl ConfigParameters { - /// Constructor - pub fn new(parameters: HashMap) -> Self { - Self { parameters } - } - - /// Useful constructor for testing - pub fn build(parameters: &[(&str, &str)]) -> Self { - let parameters = parameters - .iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect(); - - Self::new(parameters) - } - - /// Add or replace a parameter in the holder - pub fn add_parameter(&mut self, name: &str, value: &str) -> &mut Self { - let _ = self.parameters.insert(name.to_string(), value.to_string()); - - self - } - - /// Fetch a parameter from the holder. - pub fn get(&self, name: &str) -> Option { - self.parameters.get(name).cloned() - } - - /// Fetch a parameter from the holder. If the parameter is not set, the - /// given default value is returned instead. - pub fn get_or(&self, name: &str, default: &str) -> String { - self.get(name).unwrap_or(default.to_string()) - } - - /// Fetch a parameter from the holder. If the parameter is not set, an error - /// is raised. - pub fn require(&self, name: &str) -> Result { - self.get(name) - .ok_or_else(|| ConfigError::Required(name.to_string())) - } -} - -/// Dependencies builder -pub struct DependenciesBuilder { - /// Configuration - pub config: Arc, - - /// HTTP Aggregator client - pub aggregator_client: Option>, - - /// SnapshotClient - pub snapshot_client: Option>, - - /// MithrilStakeDistributionClient - pub mithril_stake_distribution_client: Option>, - - /// CertificateClient - pub certificate_client: Option>, - - /// CertificateVerifier - pub certificate_verifier: Option>, - - /// ImmutableDigester - pub immutable_digester: Option>, - - /// [SnapshotService] - pub snapshot_service: Option>, - - /// [MithrilStakeDistributionService] - pub mithril_stake_distribution_service: Option>, -} - -impl DependenciesBuilder { - /// Constructor - pub fn new(config: Arc) -> Self { - Self { - config, - aggregator_client: None, - snapshot_client: None, - mithril_stake_distribution_client: None, - certificate_client: None, - certificate_verifier: None, - immutable_digester: None, - snapshot_service: None, - mithril_stake_distribution_service: None, - } - } - - async fn build_logger(&mut self) -> StdResult { - Ok(slog_scope::logger()) - } - - /// Return an instance of the logger. Since the logger is a singleton it is - /// provider directly by its own library. - pub async fn get_logger(&mut self) -> StdResult { - self.build_logger().await - } - - async fn build_aggregator_client(&mut self) -> StdResult> { - let client = AggregatorHTTPClient::new( - &self.config.require("aggregator_endpoint")?, - APIVersionProvider::compute_all_versions_sorted()?, - ); - - Ok(Arc::new(client)) - } - - /// Get a clone of the [AggregatorClient] dependency - pub async fn get_aggregator_client(&mut self) -> StdResult> { - if self.aggregator_client.is_none() { - self.aggregator_client = Some(self.build_aggregator_client().await?); - } - - Ok(self.aggregator_client.as_ref().cloned().unwrap()) - } - - async fn build_snapshot_client(&mut self) -> StdResult> { - let client = SnapshotClient::new(self.get_aggregator_client().await?); - - Ok(Arc::new(client)) - } - - /// Get a clone of the [SnapshotClient] dependency - pub async fn get_snapshot_client(&mut self) -> StdResult> { - if self.snapshot_client.is_none() { - self.snapshot_client = Some( - self.build_snapshot_client() - .await - .with_context(|| "Dependencies Builder can not build Snapshot Client")?, - ); - } - - Ok(self.snapshot_client.as_ref().cloned().unwrap()) - } - - async fn build_mithril_stake_distribution_client( - &mut self, - ) -> StdResult> { - let client = MithrilStakeDistributionClient::new(self.get_aggregator_client().await?); - - Ok(Arc::new(client)) - } - - /// Get a clone of the [SnapshotClient] dependency - pub async fn get_mithril_stake_distribution_client( - &mut self, - ) -> StdResult> { - if self.mithril_stake_distribution_client.is_none() { - self.mithril_stake_distribution_client = Some( - self.build_mithril_stake_distribution_client() - .await - .with_context(|| { - "Dependencies Builder can not build Mithril Stake distribution Client" - })?, - ); - } - - Ok(self - .mithril_stake_distribution_client - .as_ref() - .cloned() - .unwrap()) - } - - async fn build_certificate_client(&mut self) -> StdResult> { - let client = CertificateClient::new(self.get_aggregator_client().await?); - - Ok(Arc::new(client)) - } - - /// Get a clone of the [CertificateClient] dependency - pub async fn get_certificate_client(&mut self) -> StdResult> { - if self.certificate_client.is_none() { - self.certificate_client = Some( - self.build_certificate_client() - .await - .with_context(|| "Dependencies Builder can not build Certificate Client")?, - ); - } - - Ok(self.certificate_client.as_ref().cloned().unwrap()) - } - - async fn build_certificate_verifier(&mut self) -> StdResult> { - let verifier = MithrilCertificateVerifier::new( - self.get_logger().await?, - self.get_certificate_client().await?, - ); - - Ok(Arc::new(verifier)) - } - - /// Get a clone of the [CertificateVerifier] dependency - pub async fn get_certificate_verifier(&mut self) -> StdResult> { - if self.certificate_verifier.is_none() { - self.certificate_verifier = Some( - self.build_certificate_verifier() - .await - .with_context(|| "Dependencies Builder can not build Certificate Verifier")?, - ); - } - - Ok(self.certificate_verifier.as_ref().cloned().unwrap()) - } - - async fn build_immutable_digester(&mut self) -> StdResult> { - let digester = CardanoImmutableDigester::new(None, self.get_logger().await?); - - Ok(Arc::new(digester)) - } - - /// Get a clone of the [ImmutableDigester] dependency - pub async fn get_immutable_digester(&mut self) -> StdResult> { - if self.immutable_digester.is_none() { - self.immutable_digester = Some( - self.build_immutable_digester() - .await - .with_context(|| "Dependencies Builder can not build Immutable Digester")?, - ); - } - - Ok(self.immutable_digester.as_ref().cloned().unwrap()) - } - - async fn build_snapshot_service(&mut self) -> StdResult> { - let snapshot_service = MithrilClientSnapshotService::new( - self.get_snapshot_client().await?, - self.get_certificate_client().await?, - self.get_certificate_verifier().await?, - self.get_immutable_digester().await?, - ); - - Ok(Arc::new(snapshot_service)) - } - - /// Get a clone of the [SnapshotService] dependency - pub async fn get_snapshot_service(&mut self) -> StdResult> { - if self.snapshot_service.is_none() { - self.snapshot_service = Some( - self.build_snapshot_service() - .await - .with_context(|| "Dependencies Builder can not build Snapshot Service")?, - ); - } - - Ok(self.snapshot_service.as_ref().cloned().unwrap()) - } - - async fn build_mithril_stake_distribution_service( - &mut self, - ) -> StdResult> { - let service = AppMithrilStakeDistributionService::new( - self.get_mithril_stake_distribution_client().await?, - self.get_certificate_client().await?, - self.get_certificate_verifier().await?, - ); - - Ok(Arc::new(service)) - } - - /// Get a clone of the [MithrilStakeDistributionService] dependency - pub async fn get_mithril_stake_distribution_service( - &mut self, - ) -> StdResult> { - if self.mithril_stake_distribution_service.is_none() { - self.mithril_stake_distribution_service = Some( - self.build_mithril_stake_distribution_service() - .await - .with_context(|| { - "Dependencies Builder can not build Mithril Stake Distribution Service" - })?, - ); - } - - Ok(self - .mithril_stake_distribution_service - .as_ref() - .cloned() - .unwrap()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_config_constructor() { - let config = ConfigParameters::build(&[("pika", "chu")]); - - assert_eq!( - ConfigParameters { - parameters: [("pika".to_string(), "chu".to_string())] - .into_iter() - .collect() - }, - config - ); - } - #[test] - fn test_config_set() { - let mut config = ConfigParameters::default(); - config.add_parameter("pika", "chu"); - - assert_eq!( - ConfigParameters { - parameters: [("pika".to_string(), "chu".to_string())] - .into_iter() - .collect() - }, - config - ); - } - - #[test] - fn test_config_get() { - let mut config = ConfigParameters::default(); - config.add_parameter("pika", "chu"); - - assert_eq!("chu".to_string(), config.get("pika").unwrap()); - assert!(config.get("whatever").is_none()); - } - - #[test] - fn test_config_default() { - let mut config = ConfigParameters::default(); - config.add_parameter("pika", "chu"); - - assert_eq!("chu".to_string(), config.get("pika").unwrap()); - assert_eq!("default".to_string(), config.get_or("whatever", "default")); - } - - #[test] - fn test_config_require() { - let mut config = ConfigParameters::default(); - config.add_parameter("pika", "chu"); - - assert_eq!("chu".to_string(), config.require("pika").unwrap()); - config.require("whatever").unwrap_err(); - } -} diff --git a/mithril-client-cli/src/dependencies/mod.rs b/mithril-client-cli/src/dependencies/mod.rs deleted file mode 100644 index 4d362e6f4f0..00000000000 --- a/mithril-client-cli/src/dependencies/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! Dependency manager for the client -mod builder; - -pub use builder::*; diff --git a/mithril-client-cli/src/lib.rs b/mithril-client-cli/src/lib.rs index 57c9a47557e..877997e4ea0 100644 --- a/mithril-client-cli/src/lib.rs +++ b/mithril-client-cli/src/lib.rs @@ -1,88 +1,12 @@ #![warn(missing_docs)] -//! Define everything necessary to list, download, and validate snapshots from a -//! [Mithril Aggregator](https://mithril.network/rust-doc/mithril_aggregator/index.html). -//! -//! To query an aggregator for snapshots & certificate use the [services::SnapshotService]. -//! -//! Currently, [client::Client] exposes the following features: -//! - [client::Client::show_snapshot]: call the snapshot service to get a snapshot message from a digest -//! - [client::Client::list_snapshots]: call the snapshot service to get the list of available snapshots -//! - [client::Client::list_mithril_stake_distributions]: call the mithril stake distribution service for the list of available mithril stake distributions -//! -//! Below are some examples describing the use of the library's functions from your own project: -//! -//! - [client::Client::show_snapshot] -//! ```no_run -//! use mithril_client_cli::client::Client; -//! use mithril_client_cli::common::StdResult; -//! -//! #[tokio::main] -//! async fn main() -> StdResult<()> { -//! let client = Client::new("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").await?; -//! let snapshot = client.show_snapshot("5a1288f7164bec049f34e46002e939f4c609a0ddf86636fdc4180ea22342cab7").await?; -//! -//! println!("Snapshot id={}, size={}", snapshot.digest, snapshot.size); -//! -//! Ok(()) -//! } -//! ``` -//! -//! - [client::Client::list_snapshots] -//! ```no_run -//! use mithril_client_cli::client::Client; -//! use mithril_client_cli::common::StdResult; -//! -//! #[tokio::main] -//! async fn main() -> StdResult<()> { -//! let client = Client::new("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").await?; -//! let snapshots = client.list_snapshots().await?; -//! -//! for snapshot in snapshots { -//! println!("Snapshot id={}, size={}", snapshot.digest, snapshot.size); -//! } -//! -//! Ok(()) -//! } -//! ``` -//! -//! - [client::Client::list_mithril_stake_distributions] -//! ```no_run -//! use mithril_client_cli::client::Client; -//! use mithril_client_cli::common::StdResult; -//! -//! #[tokio::main] -//! async fn main() -> StdResult<()> { -//! let client = Client::new("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").await?; -//! let stake_distributions = client.list_mithril_stake_distributions().await?; -//! -//! for stake_distribution in stake_distributions { -//! println!("Mithril Stake Distribution hash={}", stake_distribution.hash); -//! } -//! -//! Ok(()) -//! } -//! ``` - -pub mod aggregator_client; -pub mod client; -pub mod dependencies; -mod message_adapters; -pub mod services; -pub mod utils; - -pub use message_adapters::{FromCertificateMessageAdapter, FromSnapshotMessageAdapter}; - -/// `mithril-common` re-exports -pub mod common { - pub use mithril_common::{ - certificate_chain::CertificateVerifier, - crypto_helper::{ProtocolGenesisVerificationKey, ProtocolGenesisVerifier}, - entities::{Beacon, CompressionAlgorithm, Epoch}, - messages::{ - MithrilStakeDistributionListMessage, SnapshotListItemMessage, SnapshotListMessage, - SnapshotMessage, - }, - StdError, StdResult, - }; -} +//! A command line interface that uses the [Mithril Client Library](https://mithril.network/doc/manual/developer-docs/nodes/mithril-client-library) +//! to manipulate Mithril certified types from a Mithril Aggregator: +//! * Snapshots: List, Show, download and verify +//! * Mithril Stake Distribution: List, download and verify +// +//! You can find more information on how it works reading the [documentation website](https://mithril.network/doc/mithril/mithril-network/client). + +pub mod commands; +mod configuration; +mod utils; diff --git a/mithril-client-cli/src/main.rs b/mithril-client-cli/src/main.rs index d5c4795fb5b..1e2946f4983 100644 --- a/mithril-client-cli/src/main.rs +++ b/mithril-client-cli/src/main.rs @@ -1,21 +1,41 @@ #![doc = include_str!("../README.md")] -mod commands; - -use std::path::PathBuf; -use std::sync::Arc; - +use anyhow::Context; use clap::{Parser, Subcommand}; use config::{builder::DefaultState, ConfigBuilder, Map, Source, Value, ValueKind}; -use slog::{Drain, Level, Logger}; +use slog::{Drain, Fuse, Level, Logger}; +use slog_async::Async; use slog_scope::debug; +use slog_term::Decorator; +use std::io::Write; +use std::sync::Arc; +use std::{fs::File, path::PathBuf}; -use mithril_client_cli::common::StdResult; +use mithril_common::StdResult; -use commands::{ +use mithril_client_cli::commands::{ mithril_stake_distribution::MithrilStakeDistributionCommands, snapshot::SnapshotCommands, }; +enum LogOutputType { + Stdout, + File(String), +} + +impl LogOutputType { + fn get_writer(&self) -> StdResult> { + let writer: Box = match self { + LogOutputType::Stdout => Box::new(std::io::stdout()), + LogOutputType::File(filepath) => Box::new( + File::create(filepath) + .with_context(|| format!("Can not create output log file: {}", filepath))?, + ), + }; + + Ok(writer) + } +} + #[derive(Parser, Debug, Clone)] #[clap(name = "mithril-client")] #[clap( @@ -43,6 +63,14 @@ pub struct Args { /// Override configuration Aggregator endpoint URL. #[clap(long, env = "AGGREGATOR_ENDPOINT")] aggregator_endpoint: Option, + + /// Enable JSON output for logs displayed according to verbosity level + #[clap(long)] + log_format_json: bool, + + /// Redirect the logs to a file + #[clap(long, alias("o"))] + log_output: Option, } impl Args { @@ -68,13 +96,38 @@ impl Args { } } - fn build_logger(&self) -> Logger { - let decorator = slog_term::TermDecorator::new().build(); + fn get_log_output_type(&self) -> LogOutputType { + if let Some(output_filepath) = &self.log_output { + LogOutputType::File(output_filepath.to_string()) + } else { + LogOutputType::Stdout + } + } + + fn wrap_drain(&self, decorator: D) -> Fuse { let drain = slog_term::CompactFormat::new(decorator).build().fuse(); let drain = slog::LevelFilter::new(drain, self.log_level()).fuse(); - let drain = slog_async::Async::new(drain).build().fuse(); - Logger::root(Arc::new(drain), slog::o!()) + slog_async::Async::new(drain).build().fuse() + } + + fn build_logger(&self) -> StdResult { + let log_output_type = self.get_log_output_type(); + let writer = log_output_type.get_writer()?; + + let drain = if self.log_format_json { + let drain = slog_bunyan::new(writer).set_pretty(false).build().fuse(); + let drain = slog::LevelFilter::new(drain, self.log_level()).fuse(); + + slog_async::Async::new(drain).build().fuse() + } else { + match log_output_type { + LogOutputType::Stdout => self.wrap_drain(slog_term::TermDecorator::new().build()), + LogOutputType::File(_) => self.wrap_drain(slog_term::PlainDecorator::new(writer)), + } + }; + + Ok(Logger::root(Arc::new(drain), slog::o!())) } } @@ -120,7 +173,7 @@ impl ArtifactCommands { async fn main() -> StdResult<()> { // Load args let args = Args::parse(); - let _guard = slog_scope::set_global_logger(args.build_logger()); + let _guard = slog_scope::set_global_logger(args.build_logger()?); #[cfg(feature = "bundle_openssl")] openssl_probe::init_ssl_cert_env_vars(); diff --git a/mithril-client-cli/src/message_adapters/from_certificate_message_adapter.rs b/mithril-client-cli/src/message_adapters/from_certificate_message_adapter.rs deleted file mode 100644 index f1dbc49783a..00000000000 --- a/mithril-client-cli/src/message_adapters/from_certificate_message_adapter.rs +++ /dev/null @@ -1,72 +0,0 @@ -use anyhow::Context; -use mithril_common::entities::{Certificate, CertificateMetadata, CertificateSignature}; -use mithril_common::messages::{CertificateMessage, TryFromMessageAdapter}; -use mithril_common::StdResult; - -/// Adapter to convert [CertificateMessage] to [Certificate] instances -pub struct FromCertificateMessageAdapter; - -impl TryFromMessageAdapter for FromCertificateMessageAdapter { - /// Method to trigger the conversion - fn try_adapt(certificate_message: CertificateMessage) -> StdResult { - let metadata = CertificateMetadata { - protocol_version: certificate_message.metadata.protocol_version, - protocol_parameters: certificate_message.metadata.protocol_parameters, - initiated_at: certificate_message.metadata.initiated_at, - sealed_at: certificate_message.metadata.sealed_at, - signers: certificate_message.metadata.signers, - }; - - let certificate = Certificate { - hash: certificate_message.hash, - previous_hash: certificate_message.previous_hash, - beacon: certificate_message.beacon, - metadata, - protocol_message: certificate_message.protocol_message, - signed_message: certificate_message.signed_message, - aggregate_verification_key: certificate_message - .aggregate_verification_key - .try_into() - .with_context(|| { - "'FromCertificateMessageAdapter' can not convert the aggregate verification key" - })?, - signature: if certificate_message.genesis_signature.is_empty() { - CertificateSignature::MultiSignature( - certificate_message - .multi_signature - .try_into() - .with_context(|| { - "'FromCertificateMessageAdapter' can not convert the multi-signature" - })?, - ) - } else { - CertificateSignature::GenesisSignature( - certificate_message - .genesis_signature - .try_into() - .with_context(|| { - "'FromCertificateMessageAdapter' can not convert the genesis signature" - })?, - ) - }, - }; - - Ok(certificate) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn adapt_ok() { - let certificate_message = CertificateMessage { - hash: "hash123".to_string(), - ..CertificateMessage::dummy() - }; - let certificate = FromCertificateMessageAdapter::try_adapt(certificate_message).unwrap(); - - assert_eq!("hash123".to_string(), certificate.hash); - } -} diff --git a/mithril-client-cli/src/message_adapters/from_mithril_stake_distribution_message.rs b/mithril-client-cli/src/message_adapters/from_mithril_stake_distribution_message.rs deleted file mode 100644 index 60d95b5a6a1..00000000000 --- a/mithril-client-cli/src/message_adapters/from_mithril_stake_distribution_message.rs +++ /dev/null @@ -1,69 +0,0 @@ -use anyhow::Context; -use mithril_common::{ - entities::{MithrilStakeDistribution, SignedEntity, SignedEntityType}, - messages::{ - MithrilStakeDistributionMessage, SignerWithStakeMessagePart, TryFromMessageAdapter, - }, - StdResult, -}; - -pub struct FromMithrilStakeDistributionMessageAdapter; - -impl TryFromMessageAdapter> - for FromMithrilStakeDistributionMessageAdapter -{ - fn try_adapt( - from: MithrilStakeDistributionMessage, - ) -> StdResult> { - let mithril_stake_distribution = MithrilStakeDistribution { - epoch: from.epoch, - signers_with_stake: SignerWithStakeMessagePart::try_into_signers( - from.signers_with_stake, - ) - .with_context(|| { - "'FromMithrilStakeDistributionMessageAdapter' can not convert the list of signers" - })?, - hash: from.hash, - protocol_parameters: from.protocol_parameters, - }; - - let entity = SignedEntity { - signed_entity_id: mithril_stake_distribution.hash.clone(), - signed_entity_type: SignedEntityType::MithrilStakeDistribution( - mithril_stake_distribution.epoch, - ), - certificate_id: from.certificate_hash, - artifact: mithril_stake_distribution, - created_at: from.created_at, - }; - - Ok(entity) - } -} - -#[cfg(test)] -mod tests { - use chrono::{DateTime, Utc}; - use mithril_common::{entities::Epoch, test_utils::fake_data}; - - use super::*; - - #[test] - fn test_adapt() { - let message = MithrilStakeDistributionMessage { - epoch: Epoch(1), - signers_with_stake: SignerWithStakeMessagePart::from_signers( - fake_data::signers_with_stakes(2), - ), - hash: "hash-123".to_string(), - certificate_hash: "certificate-hash-123".to_string(), - created_at: DateTime::::default(), - protocol_parameters: fake_data::protocol_parameters(), - }; - - let signed_entity = FromMithrilStakeDistributionMessageAdapter::try_adapt(message).unwrap(); - - assert_eq!(2, signed_entity.artifact.signers_with_stake.len()); - assert_eq!("hash-123".to_string(), signed_entity.artifact.hash); - } -} diff --git a/mithril-client-cli/src/message_adapters/from_snapshot_message.rs b/mithril-client-cli/src/message_adapters/from_snapshot_message.rs deleted file mode 100644 index 083b5630064..00000000000 --- a/mithril-client-cli/src/message_adapters/from_snapshot_message.rs +++ /dev/null @@ -1,47 +0,0 @@ -use mithril_common::{ - entities::{SignedEntity, SignedEntityType, Snapshot}, - messages::{FromMessageAdapter, SnapshotMessage}, -}; - -/// Adapter to convert [SnapshotMessage] to [`SignedEntity`] instances -pub struct FromSnapshotMessageAdapter; - -impl FromMessageAdapter> for FromSnapshotMessageAdapter { - /// Method to trigger the conversion - fn adapt(snapshot_message: SnapshotMessage) -> SignedEntity { - let snapshot = Snapshot { - digest: snapshot_message.digest.clone(), - beacon: snapshot_message.beacon.clone(), - size: snapshot_message.size, - locations: snapshot_message.locations, - compression_algorithm: snapshot_message.compression_algorithm.unwrap_or_default(), - cardano_node_version: snapshot_message.cardano_node_version.unwrap_or_default(), - }; - - SignedEntity { - signed_entity_id: snapshot_message.digest, - signed_entity_type: SignedEntityType::CardanoImmutableFilesFull( - snapshot_message.beacon, - ), - certificate_id: snapshot_message.certificate_hash, - artifact: snapshot, - created_at: snapshot_message.created_at, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn adapt_ok() { - let snapshot_message = SnapshotMessage { - digest: "digest123".to_string(), - ..Default::default() - }; - let snapshot_item = FromSnapshotMessageAdapter::adapt(snapshot_message); - - assert_eq!("digest123".to_string(), snapshot_item.artifact.digest); - } -} diff --git a/mithril-client-cli/src/message_adapters/mod.rs b/mithril-client-cli/src/message_adapters/mod.rs deleted file mode 100644 index f7327fe5a72..00000000000 --- a/mithril-client-cli/src/message_adapters/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -mod from_certificate_message_adapter; -mod from_mithril_stake_distribution_message; -mod from_snapshot_message; -mod to_snapshot_download_message; - -pub use from_certificate_message_adapter::FromCertificateMessageAdapter; -pub use from_mithril_stake_distribution_message::FromMithrilStakeDistributionMessageAdapter; -pub use from_snapshot_message::FromSnapshotMessageAdapter; -pub use to_snapshot_download_message::ToSnapshotDownloadMessageAdapter; diff --git a/mithril-client-cli/src/message_adapters/to_snapshot_download_message.rs b/mithril-client-cli/src/message_adapters/to_snapshot_download_message.rs deleted file mode 100644 index 5b3bef6a540..00000000000 --- a/mithril-client-cli/src/message_adapters/to_snapshot_download_message.rs +++ /dev/null @@ -1,35 +0,0 @@ -use mithril_common::entities::Snapshot; -use mithril_common::messages::{SnapshotDownloadMessage, ToMessageAdapter}; - -/// Adapter to convert [Snapshot] to [SnapshotDownloadMessage] instances -pub struct ToSnapshotDownloadMessageAdapter; - -impl ToMessageAdapter<&Snapshot, SnapshotDownloadMessage> for ToSnapshotDownloadMessageAdapter { - /// Method to trigger the conversion - fn adapt(snapshot: &Snapshot) -> SnapshotDownloadMessage { - SnapshotDownloadMessage { - digest: snapshot.digest.clone(), - beacon: snapshot.beacon.clone(), - size: snapshot.size, - locations: snapshot.locations.clone(), - compression_algorithm: snapshot.compression_algorithm, - cardano_node_version: snapshot.cardano_node_version.clone(), - } - } -} - -#[cfg(test)] -mod tests { - use mithril_common::test_utils::fake_data; - - use super::*; - - #[test] - fn adapt_ok() { - let mut snapshot = fake_data::snapshots(1)[0].to_owned(); - snapshot.digest = "digest123".to_string(); - let snapshot_download_message = ToSnapshotDownloadMessageAdapter::adapt(&snapshot); - - assert_eq!("digest123".to_string(), snapshot_download_message.digest); - } -} diff --git a/mithril-client-cli/src/services/mithril_stake_distribution.rs b/mithril-client-cli/src/services/mithril_stake_distribution.rs deleted file mode 100644 index 8c2a83acc0d..00000000000 --- a/mithril-client-cli/src/services/mithril_stake_distribution.rs +++ /dev/null @@ -1,525 +0,0 @@ -//! ## Mithril Stake Distribution Service -//! -//! This module contains the service to interact with a given Mithril Aggregator -//! in order to list / download mithril stake distributions. -//! -//! ```no_run -//! use std::sync::Arc; -//! use mithril_client_cli::common::StdResult; -//! use mithril_client_cli::dependencies::{ConfigParameters, DependenciesBuilder}; -//! use mithril_client_cli::services::MithrilStakeDistributionService; -//! -//! #[tokio::main] -//! async fn main() -> StdResult<()> { -//! let mut config = ConfigParameters::default(); -//! config -//! .add_parameter("genesis_verification_key", "YOUR_GENESIS_VERIFICATION_KEY") -//! .add_parameter("aggregator_endpoint", "YOUR_AGGREGATOR_ENDPOINT"); -//! let stake_distribution_service = DependenciesBuilder::new(Arc::new(config)) -//! .get_mithril_stake_distribution_service() -//! .await?; -//! -//! for message in stake_distribution_service.list().await? { -//! println!("Stake distribution hash = {}", message.hash); -//! } -//! -//! Ok(()) -//! } -//! ``` -use anyhow::Context; -use async_trait::async_trait; -use std::{ - path::{Path, PathBuf}, - sync::Arc, -}; -use thiserror::Error; - -use mithril_common::{ - certificate_chain::CertificateVerifier, - crypto_helper::{ProtocolAggregateVerificationKey, ProtocolGenesisVerificationKey}, - entities::{MithrilStakeDistribution, ProtocolMessagePartKey}, - messages::MithrilStakeDistributionListItemMessage, - protocol::SignerBuilder, - StdError, StdResult, -}; - -use crate::aggregator_client::{CertificateClient, MithrilStakeDistributionClient}; - -/// Errors related to the StakeDistributionService -#[derive(Debug, Error)] -pub enum MithrilStakeDistributionServiceError { - /// When certificate cannot be verified - #[error("Could not verify the Mithril stake distribution multisignature, hash='{hash}', certificate hash='{certificate_hash}. {context}")] - CouldNotVerifyStakeDistribution { - /// StakeDistribution identifier - hash: String, - - /// Associated certificate - certificate_hash: String, - - /// Context - context: String, - }, - /// Associated certificate not found - #[error("Could not get associated certificate '{0}'.")] - CertificateNotFound(String), - - /// The configuration has invalid or missing parameters - #[error("Missing or invalid parameters")] - InvalidParameters(#[source] StdError), - - /// Could not find the given stake distribution - #[error("Could not find stake distribution associated to hash '{0}'.")] - CouldNotFindStakeDistribution(String), -} - -/// Definition of the service responsible of Mithril Stake Distribution. -#[async_trait] -pub trait MithrilStakeDistributionService { - /// Return a list of the certified Mithril stake distributions - async fn list(&self) -> StdResult>; - - /// Download and verify the specified stake distribution - async fn download( - &self, - hash: &str, - dirpath: &Path, - genesis_verification_key: &str, - ) -> StdResult; -} - -/// Service responsible of the MithrilStakeDistribution operations. -pub struct AppMithrilStakeDistributionService { - /// Aggreggator client for MithrilStakeDistribution - stake_distribution_client: Arc, - certificate_client: Arc, - certificate_verifier: Arc, -} - -impl AppMithrilStakeDistributionService { - /// Constructor - pub fn new( - stake_distribution_client: Arc, - certificate_client: Arc, - certificate_verifier: Arc, - ) -> Self { - Self { - stake_distribution_client, - certificate_client, - certificate_verifier, - } - } - - async fn compute_avk_from_mithril_stake_distribution( - &self, - stake_distribution: &MithrilStakeDistribution, - ) -> StdResult { - let signer_builder = SignerBuilder::new( - &stake_distribution.signers_with_stake, - &stake_distribution.protocol_parameters, - )?; - - Ok(signer_builder.compute_aggregate_verification_key()) - } - - async fn expand_eventual_artifact_hash_alias(&self, hash: &str) -> StdResult { - if hash.to_lowercase() == "latest" { - let last_mithril_stake_distribution = self.list().await.with_context(|| { - "Can not get the list of artifacts while retrieving the latest stake distribution hash" - })?; - let last_mithril_stake_distribution = - last_mithril_stake_distribution.first().ok_or_else(|| { - MithrilStakeDistributionServiceError::CouldNotFindStakeDistribution( - hash.to_string(), - ) - })?; - Ok(last_mithril_stake_distribution.hash.to_owned()) - } else { - Ok(hash.to_owned()) - } - } -} - -#[async_trait] -impl MithrilStakeDistributionService for AppMithrilStakeDistributionService { - async fn list(&self) -> StdResult> { - self.stake_distribution_client.list().await - } - - async fn download( - &self, - hash: &str, - dirpath: &Path, - genesis_verification_key: &str, - ) -> StdResult { - let stake_distribution_entity = self - .stake_distribution_client - .get(&self.expand_eventual_artifact_hash_alias(hash).await?) - .await? - .ok_or_else(|| { - MithrilStakeDistributionServiceError::CouldNotFindStakeDistribution(hash.to_owned()) - })?; - - let certificate = self - .certificate_client - .get(&stake_distribution_entity.certificate_id) - .await - .with_context(|| { - format!( - "Mithril Stake Distribution Service can not get the certificate for id: '{}'", - stake_distribution_entity.certificate_id - ) - })? - .ok_or_else(|| { - MithrilStakeDistributionServiceError::CertificateNotFound( - stake_distribution_entity.certificate_id.clone(), - ) - })?; - - let genesis_verification_key = - ProtocolGenesisVerificationKey::from_json_hex(genesis_verification_key) - .with_context(|| { - format!("Invalid genesis verification key '{genesis_verification_key}'") - }) - .map_err(MithrilStakeDistributionServiceError::InvalidParameters)?; - self.certificate_verifier - .verify_certificate_chain(certificate.clone(), &genesis_verification_key) - .await?; - - let avk = self - .compute_avk_from_mithril_stake_distribution(&stake_distribution_entity.artifact) - .await - .with_context(|| { - format!( - "Mithril Stake Distribution Service can not compute avk for artifact hash '{:?}'", - stake_distribution_entity.artifact.hash - ) - })? - .to_json_hex() - .with_context(|| "Encoding avk error")?; - - let mut protocol_message = certificate.protocol_message.clone(); - protocol_message - .set_message_part(ProtocolMessagePartKey::NextAggregateVerificationKey, avk); - - if !self - .certificate_verifier - .verify_protocol_message(&protocol_message, &certificate) - { - return Err( - MithrilStakeDistributionServiceError::CouldNotVerifyStakeDistribution { - hash: hash.to_owned(), - certificate_hash: certificate.hash, - context: "Verification failed: messages do not match.".to_string(), - } - .into(), - ); - } - - if !dirpath.is_dir() { - std::fs::create_dir_all(dirpath)?; - } - let filepath = PathBuf::new().join(dirpath).join(format!( - "mithril_stake_distribution-{}.json", - stake_distribution_entity.artifact.hash - )); - std::fs::write( - &filepath, - serde_json::to_string(&stake_distribution_entity.artifact).with_context(|| { - format!( - "Can not serialize stake distribution artifact '{:?}'", - stake_distribution_entity.artifact - ) - })?, - )?; - - Ok(filepath) - } -} - -#[cfg(test)] -mod tests { - use chrono::{DateTime, Utc}; - use mithril_common::{ - certificate_chain::MithrilCertificateVerifier, - crypto_helper::ProtocolGenesisSigner, - entities::{Epoch, SignerWithStake}, - messages::{ - CertificateMessage, MithrilStakeDistributionListMessage, - MithrilStakeDistributionMessage, SignerWithStakeMessagePart, - }, - test_utils::{fake_data, MithrilFixtureBuilder}, - }; - - use crate::{ - aggregator_client::MockAggregatorHTTPClient, services::MockCertificateVerifierImpl, - }; - - use super::*; - - fn get_stake_distribution_list_message() -> MithrilStakeDistributionListMessage { - vec![ - MithrilStakeDistributionListItemMessage::dummy(), - MithrilStakeDistributionListItemMessage { - hash: "hash-456".to_string(), - ..MithrilStakeDistributionListItemMessage::dummy() - }, - ] - } - - fn get_stake_distribution_message( - signers_with_stake: &[SignerWithStake], - ) -> MithrilStakeDistributionMessage { - MithrilStakeDistributionMessage { - epoch: Epoch(1), - signers_with_stake: SignerWithStakeMessagePart::from_signers( - signers_with_stake.to_owned(), - ), - hash: "hash-123".to_string(), - certificate_hash: "certificate-hash-123".to_string(), - created_at: DateTime::::default(), - protocol_parameters: fake_data::protocol_parameters(), - } - } - - /// Instantiate a Genesis Signer and its associated Verifier - pub fn setup_genesis() -> (ProtocolGenesisSigner, ProtocolGenesisVerificationKey) { - let genesis_signer = ProtocolGenesisSigner::create_deterministic_genesis_signer(); - let genesis_verifier = genesis_signer.create_genesis_verifier(); - (genesis_signer, genesis_verifier.to_verification_key()) - } - - #[tokio::test] - async fn list_ok() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client.expect_get_content().returning(|_| { - Ok(serde_json::to_string(&get_stake_distribution_list_message()).unwrap()) - }); - let http_client = Arc::new(http_client); - let certificate_client = Arc::new(CertificateClient::new(http_client.clone())); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - certificate_client.clone(), - Arc::new(MithrilCertificateVerifier::new( - slog_scope::logger(), - certificate_client, - )), - ); - let list = service.list().await.unwrap(); - - assert_eq!(2, list.len()); - } - - #[tokio::test] - async fn download_ok() { - let signers_with_stake = MithrilFixtureBuilder::default() - .with_signers(2) - .build() - .signers_with_stake(); - let stake_distribution_message = get_stake_distribution_message(&signers_with_stake); - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(move |_| Ok(serde_json::to_string(&stake_distribution_message).unwrap())) - .times(1); - http_client - .expect_get_content() - .returning(|_| { - let mut message = CertificateMessage::dummy(); - message.signed_message = message.protocol_message.compute_hash(); - let message = serde_json::to_string(&message).unwrap(); - - Ok(message) - }) - .times(1); - let http_client = Arc::new(http_client); - let mut certificate_verifier = MockCertificateVerifierImpl::new(); - certificate_verifier - .expect_verify_certificate_chain() - .returning(|_, _| Ok(())) - .times(1); - certificate_verifier - .expect_verify_protocol_message() - .returning(|_, _| true) - .times(1); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - Arc::new(CertificateClient::new(http_client.clone())), - Arc::new(certificate_verifier), - ); - - let dirpath = std::env::temp_dir().join("test_download_ok"); - let (_, genesis_verification_key) = setup_genesis(); - let filepath = service - .download( - "hash-123", - &dirpath, - &genesis_verification_key.to_json_hex().unwrap(), - ) - .await - .unwrap(); - - assert!(filepath.exists()); - } - - #[tokio::test] - async fn download_ko() { - let signers_with_stake = MithrilFixtureBuilder::default() - .with_signers(2) - .build() - .signers_with_stake(); - let stake_distribution_message = get_stake_distribution_message(&signers_with_stake); - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(move |_| Ok(serde_json::to_string(&stake_distribution_message).unwrap())) - .times(1); - http_client - .expect_get_content() - .returning(|_| { - let mut message = CertificateMessage::dummy(); - message.signed_message = message.protocol_message.compute_hash(); - let message = serde_json::to_string(&message).unwrap(); - - Ok(message) - }) - .times(1); - let http_client = Arc::new(http_client); - let mut certificate_verifier = MockCertificateVerifierImpl::new(); - certificate_verifier - .expect_verify_certificate_chain() - .returning(|_, _| Ok(())) - .times(1); - certificate_verifier - .expect_verify_protocol_message() - .returning(|_, _| false) - .times(1); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - Arc::new(CertificateClient::new(http_client.clone())), - Arc::new(certificate_verifier), - ); - - let dirpath = std::env::temp_dir().join("test_download_ko"); - let (_, genesis_verification_key) = setup_genesis(); - let _error = service - .download( - "hash-123", - &dirpath, - &genesis_verification_key.to_json_hex().unwrap(), - ) - .await - .unwrap_err(); - } - - #[tokio::test] - async fn expand_eventual_artifact_hash_alias_should_returns_hash() { - let http_client = Arc::new(MockAggregatorHTTPClient::new()); - let certificate_client = Arc::new(CertificateClient::new(http_client.clone())); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - certificate_client.clone(), - Arc::new(MithrilCertificateVerifier::new( - slog_scope::logger(), - certificate_client, - )), - ); - - let hash = service - .expand_eventual_artifact_hash_alias("hash-123") - .await - .unwrap(); - - assert_eq!("hash-123", hash); - } - - #[tokio::test] - async fn expand_eventual_artifact_hash_alias_should_returns_latest_lowercase() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client.expect_get_content().returning(|_| { - Ok(serde_json::to_string(&get_stake_distribution_list_message()).unwrap()) - }); - let http_client = Arc::new(http_client); - let certificate_client = Arc::new(CertificateClient::new(http_client.clone())); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - certificate_client.clone(), - Arc::new(MithrilCertificateVerifier::new( - slog_scope::logger(), - certificate_client, - )), - ); - - let hash = service - .expand_eventual_artifact_hash_alias("latest") - .await - .unwrap(); - - assert_eq!("hash-123", hash); - } - - #[tokio::test] - async fn expand_eventual_artifact_hash_alias_should_returns_latest_uppercase() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client.expect_get_content().returning(|_| { - Ok(serde_json::to_string(&get_stake_distribution_list_message()).unwrap()) - }); - let http_client = Arc::new(http_client); - let certificate_client = Arc::new(CertificateClient::new(http_client.clone())); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - certificate_client.clone(), - Arc::new(MithrilCertificateVerifier::new( - slog_scope::logger(), - certificate_client, - )), - ); - - let hash = service - .expand_eventual_artifact_hash_alias("LATEST") - .await - .unwrap(); - - assert_eq!("hash-123", hash); - } - - #[tokio::test] - async fn expand_eventual_artifact_hash_alias_should_error() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(|_| Ok("[]".to_string())); - let http_client = Arc::new(http_client); - let certificate_client = Arc::new(CertificateClient::new(http_client.clone())); - let service = AppMithrilStakeDistributionService::new( - Arc::new(MithrilStakeDistributionClient::new(http_client.clone())), - certificate_client.clone(), - Arc::new(MithrilCertificateVerifier::new( - slog_scope::logger(), - certificate_client, - )), - ); - - let err = service - .expand_eventual_artifact_hash_alias("latest") - .await - .expect_err( - "expand_eventual_artifact_hash_alias should returns an error if there is no latest.", - ); - - if let Some(e) = err.downcast_ref::() { - match e { - MithrilStakeDistributionServiceError::CouldNotFindStakeDistribution(hash) => { - assert_eq!("latest", hash.as_str()); - } - _ => panic!( - "Wrong error type when Mithril Stake Sistribution could not be found {e:?}." - ), - } - } else { - panic!( - "Expected a MithrilStakeDistributionServiceError when Mithril Stake Sistribution can not be found. Got {err:?}: '{err}'" - ); - } - } -} diff --git a/mithril-client-cli/src/services/mock.rs b/mithril-client-cli/src/services/mock.rs deleted file mode 100644 index 80b19cdde61..00000000000 --- a/mithril-client-cli/src/services/mock.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::path::Path; - -use async_trait::async_trait; -use mithril_common::certificate_chain::CertificateVerifier; -use mithril_common::crypto_helper::ProtocolGenesisVerificationKey; -use mithril_common::digesters::{ImmutableDigester, ImmutableDigesterError}; -use mithril_common::entities::{Beacon, Certificate, ProtocolMessage}; -use mithril_common::StdResult; -use mockall::mock; - -mock! { - pub DigesterImpl { } - - #[async_trait] - impl ImmutableDigester for DigesterImpl { - async fn compute_digest( - &self, - dirpath: &Path, - beacon: &Beacon, - ) -> Result; - } -} - -mock! { - pub CertificateVerifierImpl { } - - #[async_trait] - impl CertificateVerifier for CertificateVerifierImpl { - async fn verify_genesis_certificate( - &self, - genesis_certificate: &Certificate, - genesis_verification_key: &ProtocolGenesisVerificationKey, - ) -> StdResult<()>; - - async fn verify_certificate( - &self, - certificate: &Certificate, - genesis_verification_key: &ProtocolGenesisVerificationKey, - ) -> StdResult>; - - async fn verify_certificate_chain( - &self, - certificate: Certificate, - genesis_verification_key: &ProtocolGenesisVerificationKey, - ) -> StdResult<()>; - - fn verify_protocol_message( - &self, - protocol_message: &ProtocolMessage, - certificate: &Certificate, - ) -> bool; - } -} diff --git a/mithril-client-cli/src/services/mod.rs b/mithril-client-cli/src/services/mod.rs deleted file mode 100644 index 506598ec77f..00000000000 --- a/mithril-client-cli/src/services/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Services -//! This module contains the different services tied with their bounded context. -mod mithril_stake_distribution; -mod snapshot; - -#[cfg(test)] -mod mock; - -pub use mithril_stake_distribution::*; -pub use snapshot::*; - -#[cfg(test)] -pub use mock::*; diff --git a/mithril-client-cli/src/services/snapshot.rs b/mithril-client-cli/src/services/snapshot.rs deleted file mode 100644 index 829ea515a6c..00000000000 --- a/mithril-client-cli/src/services/snapshot.rs +++ /dev/null @@ -1,847 +0,0 @@ -//! ## Snapshot Service -//! -//! This module contains the service to interact with a given Mithril Aggregator -//! in order to list / show / download snapshots. -//! -//! ```no_run -//! use std::sync::Arc; -//! use mithril_client_cli::common::*; -//! use mithril_client_cli::{dependencies::{ConfigParameters, DependenciesBuilder}, services::SnapshotService}; -//! -//! #[tokio::main] -//! async fn main() -> StdResult<()> { -//! let mut config = ConfigParameters::default(); -//! config -//! .add_parameter("genesis_verification_key", "YOUR_GENESIS_VERIFICATION_KEY") -//! .add_parameter("aggregator_endpoint", "YOUR_AGGREGATOR_ENDPOINT"); -//! let snapshot_service = DependenciesBuilder::new(Arc::new(config)) -//! .get_snapshot_service() -//! .await?; -//! -//! for message in snapshot_service.list().await? { -//! println!("Snapshot digest = {}", message.digest); -//! } -//! -//! Ok(()) -//! } -//! ``` -use anyhow::Context; -use async_trait::async_trait; -use futures::Future; -use indicatif::{MultiProgress, ProgressBar, ProgressState, ProgressStyle}; -use slog_scope::{debug, warn}; -use std::{ - fmt::Write, - fs::File, - path::{Path, PathBuf}, - sync::Arc, - time::Duration, -}; -use thiserror::Error; -use tokio::{select, time::sleep}; - -use mithril_common::{ - digesters::ImmutableDigester, - entities::{Certificate, ProtocolMessagePartKey, SignedEntity, Snapshot}, - messages::{SnapshotListItemMessage, SnapshotMessage}, - StdError, StdResult, -}; - -use crate::{ - aggregator_client::{AggregatorHTTPClientError, CertificateClient, SnapshotClient}, - common::{CertificateVerifier, ProtocolGenesisVerificationKey, ProtocolGenesisVerifier}, - utils::{ - DownloadProgressReporter, ProgressOutputType, ProgressPrinter, SnapshotUnpacker, - SnapshotUnpackerError, - }, -}; - -/// [SnapshotService] related errors. -#[derive(Error, Debug)] -pub enum SnapshotServiceError { - /// The given identifier does not link to an existing snapshot. - #[error("Snapshot '{0}' not found")] - SnapshotNotFound(String), - - /// Error raised when the certificate verification failed for the downloaded - /// archive. - #[error("Certificate verification failed (snapshot digest = '{digest}').")] - CouldNotVerifySnapshot { - /// snapshot digest - digest: String, - }, - - /// The given certificate could not be found, contains the certificate hash - #[error("Could not find certificate '{0}'.")] - CouldNotFindCertificate(String), - - /// The configuration has invalid or missing parameters - #[error("Missing or invalid parameters: {0:?}")] - InvalidParameters(StdError), -} - -/// ## SnapshotService -/// -/// This trait is the interface for the Snapshot service used in the main commands. -#[async_trait] -pub trait SnapshotService: Sync + Send { - /// Return the list of the snapshots stored by the Aggregator. - async fn list(&self) -> StdResult>; - - /// Show details of the snapshot identified by the given digest. - async fn show(&self, digest: &str) -> StdResult; - - /// Download and verify the snapshot identified by the given digest. - /// The returned path is the location where the archive has been unpacked. - async fn download( - &self, - snapshot_entity: &SignedEntity, - pathdir: &Path, - genesis_verification_key: &str, - progress_output_type: ProgressOutputType, - ) -> StdResult; -} - -/// Service used by the Command to perform business oriented tasks. -pub struct MithrilClientSnapshotService { - /// Snapshot HTTP client - snapshot_client: Arc, - - /// Certificate HTTP client - certificate_client: Arc, - - /// Certificate verifier - certificate_verifier: Arc, - - /// Imutable digester - immutable_digester: Arc, -} - -impl MithrilClientSnapshotService { - /// Create a new instance of the service. - pub fn new( - snapshot_client: Arc, - certificate_client: Arc, - certificate_verifier: Arc, - immutable_digester: Arc, - ) -> Self { - Self { - snapshot_client, - certificate_client, - certificate_verifier, - immutable_digester, - } - } - - fn check_disk_space_error(&self, error: StdError) -> StdResult { - if let Some(SnapshotUnpackerError::NotEnoughSpace { - left_space: _, - pathdir: _, - archive_size: _, - }) = error.downcast_ref::() - { - Ok(format!("Warning: {}", error)) - } else { - Err(error) - } - } - - async fn verify_certificate_chain( - &self, - genesis_verification_key: &str, - certificate: &Certificate, - ) -> StdResult<()> { - let genesis_verification_key = - ProtocolGenesisVerificationKey::from_json_hex(genesis_verification_key) - .with_context(|| { - format!("Invalid genesis verification key '{genesis_verification_key}'") - }) - .map_err(SnapshotServiceError::InvalidParameters)?; - let genesis_verifier = - ProtocolGenesisVerifier::from_verification_key(genesis_verification_key); - - self.certificate_verifier - .verify_certificate_chain(certificate.clone(), &genesis_verifier.to_verification_key()) - .await?; - - Ok(()) - } - - async fn wait_spinner( - &self, - progress_bar: &MultiProgress, - future: impl Future>, - ) -> StdResult<()> { - let pb = progress_bar.add(ProgressBar::new_spinner()); - let spinner = async move { - loop { - pb.tick(); - sleep(Duration::from_millis(50)).await; - } - }; - - select! { - _ = spinner => Ok(()), - res = future => res, - } - } - - async fn expand_eventual_snapshot_alias(&self, snapshot_id: &str) -> StdResult { - if snapshot_id.to_lowercase() == "latest" { - let last_snapshot = self.list().await.with_context(|| { - "Can not get the list of snapshots while retrieving the latest snapshot digest" - })?; - let last_snapshot = last_snapshot - .first() - .ok_or_else(|| SnapshotServiceError::SnapshotNotFound(snapshot_id.to_string()))?; - Ok(last_snapshot.digest.to_owned()) - } else { - Ok(snapshot_id.to_owned()) - } - } -} - -#[async_trait] -impl SnapshotService for MithrilClientSnapshotService { - async fn list(&self) -> StdResult> { - debug!("Snapshot service: list."); - - self.snapshot_client.list().await - } - - async fn show(&self, digest: &str) -> StdResult { - debug!("Snapshot service: show."); - let snapshot_message = self - .snapshot_client - .show(&self.expand_eventual_snapshot_alias(digest).await?) - .await - .map_err(|e| match &e.downcast_ref::() { - Some(AggregatorHTTPClientError::RemoteServerLogical(_)) => { - SnapshotServiceError::SnapshotNotFound(digest.to_owned()).into() - } - _ => e, - })?; - - Ok(snapshot_message) - } - - async fn download( - &self, - snapshot_entity: &SignedEntity, - download_dir: &Path, - genesis_verification_key: &str, - progress_output_type: ProgressOutputType, - ) -> StdResult { - debug!("Snapshot service: download."); - - let db_dir = download_dir.join("db"); - let progress_bar = ProgressPrinter::new(progress_output_type, 6); - progress_bar.report_step(1, "Checking local disk info…")?; - let unpacker = SnapshotUnpacker; - - if let Err(e) = unpacker.check_prerequisites( - &db_dir, - snapshot_entity.artifact.size, - snapshot_entity.artifact.compression_algorithm, - ) { - progress_bar.report_step(1, &self.check_disk_space_error(e)?)?; - } - - std::fs::create_dir_all(&db_dir).with_context(|| { - format!( - "Download: could not create target directory '{}'.", - db_dir.display() - ) - })?; - - progress_bar.report_step(2, "Fetching the certificate's information…")?; - let certificate = self - .certificate_client - .get(&snapshot_entity.certificate_id) - .await - .with_context(|| { - format!( - "Snapshot Service can not get the certificate for id: '{}'", - snapshot_entity.certificate_id - ) - })? - .ok_or_else(|| { - SnapshotServiceError::CouldNotFindCertificate( - snapshot_entity.certificate_id.clone(), - ) - })?; - - progress_bar.report_step(3, "Verifying the certificate chain…")?; - let verifier = self.verify_certificate_chain(genesis_verification_key, &certificate); - self.wait_spinner(&progress_bar, verifier).await?; - - progress_bar.report_step(4, "Downloading and unpacking the snapshot…")?; - let pb = progress_bar.add(ProgressBar::new(snapshot_entity.artifact.size)); - pb.set_style(ProgressStyle::with_template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({eta})") - .unwrap() - .with_key("eta", |state: &ProgressState, w: &mut dyn Write| write!(w, "{:.1}s", state.eta().as_secs_f64()).unwrap()) - .progress_chars("#>-")); - self.snapshot_client - .download_unpack( - &snapshot_entity.artifact, - &db_dir, - DownloadProgressReporter::new(pb, progress_output_type), - ) - .await - .with_context(|| { - format!( - "Could not download file in directory '{}'", - download_dir.display() - ) - })?; - - // Append 'clean' file to speedup node bootstrap - if let Err(error) = File::create(db_dir.join("clean")) { - warn!( - "Could not create clean shutdown marker file in directory {}: {error}", - db_dir.display() - ); - }; - - progress_bar.report_step(5, "Computing the snapshot digest…")?; - let unpacked_snapshot_digest = self - .immutable_digester - .compute_digest(&db_dir, &certificate.beacon) - .await - .with_context(|| format!("Could not compute digest in '{}'", db_dir.display()))?; - - progress_bar.report_step(6, "Verifying the snapshot signature…")?; - let expected_message = { - let mut protocol_message = certificate.protocol_message.clone(); - protocol_message.set_message_part( - ProtocolMessagePartKey::SnapshotDigest, - unpacked_snapshot_digest, - ); - protocol_message.compute_hash() - }; - - if expected_message != certificate.signed_message { - debug!("Digest verification failed, removing unpacked files & directory."); - - if let Err(error) = std::fs::remove_dir_all(&db_dir) { - warn!("Error while removing unpacked files & directory: {error}."); - } - - return Err(SnapshotServiceError::CouldNotVerifySnapshot { - digest: snapshot_entity.artifact.digest.clone(), - } - .into()); - } - - Ok(db_dir) - } -} - -#[cfg(test)] -mod tests { - use anyhow::anyhow; - use chrono::{DateTime, Utc}; - use flate2::{write::GzEncoder, Compression}; - use mithril_common::{ - crypto_helper::tests_setup::setup_genesis, - digesters::DumbImmutableDigester, - entities::CompressionAlgorithm, - messages::{ - CertificateMessage, FromMessageAdapter, SnapshotListItemMessage, SnapshotListMessage, - SnapshotMessage, - }, - test_utils::fake_data, - }; - use std::{ - ffi::OsStr, - fs::{create_dir_all, File}, - io::Write, - }; - - use crate::{ - aggregator_client::{AggregatorClient, MockAggregatorHTTPClient}, - dependencies::{ConfigParameters, DependenciesBuilder}, - services::mock::*, - FromSnapshotMessageAdapter, - }; - - use super::*; - - /// see [`archive_file_path`] to see where the dummy will be created - fn build_dummy_snapshot(digest: &str, data_expected: &str, test_dir: &Path) { - // create a fake file to archive - let data_file_path = { - let data_file_path = test_dir.join("db").join("test_data.txt"); - create_dir_all(data_file_path.parent().unwrap()).unwrap(); - - let mut source_file = File::create(data_file_path.as_path()).unwrap(); - write!(source_file, "{data_expected}").unwrap(); - - data_file_path - }; - - // create the archive - let archive_file_path = test_dir.join(format!("snapshot-{digest}")); - let archive_file = File::create(archive_file_path).unwrap(); - let archive_encoder = GzEncoder::new(&archive_file, Compression::default()); - let mut archive_builder = tar::Builder::new(archive_encoder); - archive_builder - .append_dir_all(".", data_file_path.parent().unwrap()) - .unwrap(); - archive_builder.into_inner().unwrap().finish().unwrap(); - - // remove the fake file - let _ = std::fs::remove_dir_all(data_file_path.parent().unwrap()); - } - - fn get_snapshot_list_message() -> SnapshotListMessage { - let item1 = SnapshotListItemMessage { - digest: "digest-1".to_string(), - beacon: fake_data::beacon(), - certificate_hash: "certificate-hash-1".to_string(), - size: 1024, - created_at: DateTime::::default(), - locations: vec!["location-1.1".to_string(), "location-1.2".to_string()], - compression_algorithm: Some(CompressionAlgorithm::Zstandard), - cardano_node_version: None, - }; - let item2 = SnapshotListItemMessage { - digest: "digest-2".to_string(), - beacon: fake_data::beacon(), - certificate_hash: "certificate-hash-2".to_string(), - size: 1024, - created_at: DateTime::::default(), - locations: vec!["location-2.1".to_string(), "location-2.2".to_string()], - compression_algorithm: None, - cardano_node_version: Some("1.0.0".to_string()), - }; - - vec![item1, item2] - } - - fn get_snapshot_message() -> SnapshotMessage { - SnapshotMessage { - digest: "digest-10".to_string(), - beacon: fake_data::beacon(), - certificate_hash: "snapshot-digest-123".to_string(), - size: 1024, - created_at: DateTime::::default(), - locations: vec!["location-10.1".to_string(), "location-10.2".to_string()], - compression_algorithm: Some(CompressionAlgorithm::Gzip), - cardano_node_version: Some("0.0.1".to_string()), - } - } - - fn get_mocks_for_snapshot_service_configured_to_make_download_succeed() -> ( - MockAggregatorHTTPClient, - MockCertificateVerifierImpl, - DumbImmutableDigester, - ) { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client.expect_probe().returning(|_| Ok(())); - http_client - .expect_download_unpack() - .returning(move |_, _, _, _| Ok(())) - .times(1); - http_client.expect_get_content().returning(|_| { - let mut message = CertificateMessage::dummy(); - message.signed_message = message.protocol_message.compute_hash(); - let message = serde_json::to_string(&message).unwrap(); - - Ok(message) - }); - - let mut certificate_verifier = MockCertificateVerifierImpl::new(); - certificate_verifier - .expect_verify_certificate_chain() - .returning(|_, _| Ok(())) - .times(1); - - let dumb_digester = DumbImmutableDigester::new("snapshot-digest-123", true); - - (http_client, certificate_verifier, dumb_digester) - } - - fn get_dep_builder(http_client: Arc) -> DependenciesBuilder { - let mut builder = DependenciesBuilder::new(Arc::new(ConfigParameters::default())); - builder.certificate_verifier = Some(Arc::new(MockCertificateVerifierImpl::new())); - builder.immutable_digester = Some(Arc::new(DumbImmutableDigester::new("digest", true))); - builder.aggregator_client = Some(http_client); - - builder - } - - #[tokio::test] - async fn test_list_snapshots() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(|_| Ok(serde_json::to_string(&get_snapshot_list_message()).unwrap())); - let snapshot_service = get_dep_builder(Arc::new(http_client)) - .get_snapshot_service() - .await - .unwrap(); - - let list = snapshot_service.list().await.unwrap(); - - assert_eq!(2, list.len()); - } - - #[tokio::test] - async fn test_list_snapshots_err() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(|_| { - Err(AggregatorHTTPClientError::SubsystemError(anyhow!( - "an error" - ))) - }) - .times(1); - let snapshot_service = get_dep_builder(Arc::new(http_client)) - .get_snapshot_service() - .await - .unwrap(); - - snapshot_service.list().await.unwrap_err(); - } - - #[tokio::test] - async fn test_show_snapshot() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .return_once(|_| Ok(serde_json::to_string(&get_snapshot_message()).unwrap())) - .times(1); - let snapshot_service = get_dep_builder(Arc::new(http_client)) - .get_snapshot_service() - .await - .unwrap(); - - assert_eq!( - "digest-10".to_string(), - snapshot_service.show("digest").await.unwrap().digest - ); - } - - #[tokio::test] - async fn test_show_snapshot_not_found() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .return_once(move |_| { - Err(AggregatorHTTPClientError::RemoteServerLogical(anyhow!( - "whatever".to_string(), - ))) - }) - .times(1); - let snapshot_service = get_dep_builder(Arc::new(http_client)) - .get_snapshot_service() - .await - .unwrap(); - - snapshot_service.show("digest-10").await.unwrap_err(); - } - - #[tokio::test] - async fn test_show_snapshot_err() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .return_once(move |_| { - Err(AggregatorHTTPClientError::ApiVersionMismatch(anyhow!( - "whatever".to_string() - ))) - }) - .times(1); - let snapshot_service = get_dep_builder(Arc::new(http_client)) - .get_snapshot_service() - .await - .unwrap(); - - snapshot_service.show("digest-10").await.unwrap_err(); - } - - #[tokio::test] - async fn test_download_snapshot_ok() { - let test_path = std::env::temp_dir().join("test_download_snapshot_ok"); - let _ = std::fs::remove_dir_all(&test_path); - - let (mut http_client, certificate_verifier, digester) = - get_mocks_for_snapshot_service_configured_to_make_download_succeed(); - http_client - .expect_post_content() - .returning(|_, _| Ok(String::new())); - - let mut builder = get_dep_builder(Arc::new(http_client)); - builder.certificate_verifier = Some(Arc::new(certificate_verifier)); - builder.immutable_digester = Some(Arc::new(digester)); - let snapshot_service = builder.get_snapshot_service().await.unwrap(); - - let snapshot = FromSnapshotMessageAdapter::adapt(get_snapshot_message()); - build_dummy_snapshot( - "digest-10.tar.gz", - "1234567890".repeat(124).as_str(), - &test_path, - ); - - let (_, verifier) = setup_genesis(); - let genesis_verification_key = verifier.to_verification_key(); - - let filepath = snapshot_service - .download( - &snapshot, - &test_path, - &genesis_verification_key.to_json_hex().unwrap(), - ProgressOutputType::Hidden, - ) - .await - .expect("Snapshot download should succeed."); - assert!( - filepath.is_dir(), - "Unpacked location must be in a directory." - ); - assert_eq!(Some(OsStr::new("db")), filepath.file_name()); - } - - #[tokio::test] - async fn test_download_snapshot_ok_add_clean_file_allowing_node_bootstrap_speedup() { - let test_path = std::env::temp_dir() - .join("test_download_snapshot_ok_add_clean_file_allowing_node_bootstrap_speedup"); - let _ = std::fs::remove_dir_all(&test_path); - - let (mut http_client, certificate_verifier, digester) = - get_mocks_for_snapshot_service_configured_to_make_download_succeed(); - http_client - .expect_post_content() - .returning(|_, _| Ok(String::new())); - - let mut builder = get_dep_builder(Arc::new(http_client)); - builder.certificate_verifier = Some(Arc::new(certificate_verifier)); - builder.immutable_digester = Some(Arc::new(digester)); - let snapshot_service = builder.get_snapshot_service().await.unwrap(); - - let snapshot = FromSnapshotMessageAdapter::adapt(get_snapshot_message()); - build_dummy_snapshot( - "digest-10.tar.gz", - "1234567890".repeat(124).as_str(), - &test_path, - ); - - let (_, verifier) = setup_genesis(); - let genesis_verification_key = verifier.to_verification_key(); - - let filepath = snapshot_service - .download( - &snapshot, - &test_path, - &genesis_verification_key.to_json_hex().unwrap(), - ProgressOutputType::Hidden, - ) - .await - .expect("Snapshot download should succeed."); - - let clean_file = filepath.join("clean"); - - assert!( - clean_file.is_file(), - "'clean' file should exist and be a file" - ); - - let clean_file_metadata = clean_file.metadata().unwrap(); - assert_eq!(clean_file_metadata.len(), 0, "'clean' file should be empty") - } - - #[tokio::test] - async fn test_download_snapshot_invalid_digest() { - let test_path = std::env::temp_dir().join("test_download_snapshot_invalid_digest"); - let _ = std::fs::remove_dir_all(&test_path); - - let (mut http_client, certificate_verifier, _) = - get_mocks_for_snapshot_service_configured_to_make_download_succeed(); - http_client - .expect_post_content() - .returning(|_, _| Ok(String::new())); - let immutable_digester = DumbImmutableDigester::new("snapshot-digest-KO", true); - - let mut dep_builder = get_dep_builder(Arc::new(http_client)); - dep_builder.certificate_verifier = Some(Arc::new(certificate_verifier)); - dep_builder.immutable_digester = Some(Arc::new(immutable_digester)); - let snapshot_service = dep_builder.get_snapshot_service().await.unwrap(); - - let mut signed_entity = FromSnapshotMessageAdapter::adapt(get_snapshot_message()); - signed_entity.artifact.digest = "digest-10".to_string(); - - let (_, verifier) = setup_genesis(); - let genesis_verification_key = verifier.to_verification_key(); - build_dummy_snapshot( - "digest-10.tar.gz", - "1234567890".repeat(124).as_str(), - &test_path, - ); - - let err = snapshot_service - .download( - &signed_entity, - &test_path, - &genesis_verification_key.to_json_hex().unwrap(), - ProgressOutputType::Hidden, - ) - .await - .expect_err("Snapshot digest comparison should fail."); - - if let Some(e) = err.downcast_ref::() { - match e { - SnapshotServiceError::CouldNotVerifySnapshot { digest } => { - assert_eq!("digest-10", digest.as_str()); - } - _ => panic!("Wrong error type when snapshot could not be verified."), - } - } else { - panic!( - "Expected a SnapshotServiceError when snapshot can not be verified. Got {err:?}: '{err}'" - ); - } - let filepath = test_path.join("snapshot-digest-10.tar.gz"); - assert!(filepath.exists()); - let unpack_dir = filepath - .parent() - .expect("Test downloaded file must be in a directory.") - .join("db"); - assert!(!unpack_dir.exists()); - } - - #[tokio::test] - async fn test_download_snapshot_dir_already_exists() { - let test_path = std::env::temp_dir().join("test_download_snapshot_dir_already_exists"); - let _ = std::fs::remove_dir_all(&test_path); - create_dir_all(test_path.join("db")).unwrap(); - - let http_client = MockAggregatorHTTPClient::new(); - let mut dep_builder = get_dep_builder(Arc::new(http_client)); - let snapshot_service = dep_builder.get_snapshot_service().await.unwrap(); - - let (_, verifier) = setup_genesis(); - let genesis_verification_key = verifier.to_verification_key(); - let snapshot = FromSnapshotMessageAdapter::adapt(get_snapshot_message()); - - let err = snapshot_service - .download( - &snapshot, - &test_path, - &genesis_verification_key.to_json_hex().unwrap(), - ProgressOutputType::Hidden, - ) - .await - .expect_err("Snapshot download should fail."); - - if let Some(e) = err.downcast_ref::() { - match e { - SnapshotUnpackerError::UnpackDirectoryAlreadyExists(path) => { - assert_eq!(&test_path.join("db"), path); - } - _ => panic!("Wrong error type when unpack dir already exists."), - } - } else { - panic!("Expected a SnapshotServiceError when unpack dir already exists. {err}"); - } - } - - #[tokio::test] - async fn expand_eventual_snapshot_alias_should_returns_id() { - let http_client = MockAggregatorHTTPClient::new(); - let mut dep_builder = get_dep_builder(Arc::new(http_client)); - let snapshot_service = MithrilClientSnapshotService::new( - dep_builder.get_snapshot_client().await.unwrap(), - dep_builder.get_certificate_client().await.unwrap(), - dep_builder.get_certificate_verifier().await.unwrap(), - dep_builder.get_immutable_digester().await.unwrap(), - ); - - let digest = snapshot_service - .expand_eventual_snapshot_alias("digest-1") - .await - .unwrap(); - - assert_eq!("digest-1", digest); - } - - #[tokio::test] - async fn expand_eventual_snapshot_alias_latest_lowercase() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(|_| Ok(serde_json::to_string(&get_snapshot_list_message()).unwrap())); - let mut dep_builder = get_dep_builder(Arc::new(http_client)); - let snapshot_service = MithrilClientSnapshotService::new( - dep_builder.get_snapshot_client().await.unwrap(), - dep_builder.get_certificate_client().await.unwrap(), - dep_builder.get_certificate_verifier().await.unwrap(), - dep_builder.get_immutable_digester().await.unwrap(), - ); - - let digest = snapshot_service - .expand_eventual_snapshot_alias("latest") - .await - .expect("expand_eventual_snapshot_alias should not error when latest is passed as parameter."); - - assert_eq!("digest-1".to_string(), digest); - } - - #[tokio::test] - async fn expand_eventual_snapshot_alias_latest_uppercase() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(|_| Ok(serde_json::to_string(&get_snapshot_list_message()).unwrap())); - let mut dep_builder = get_dep_builder(Arc::new(http_client)); - let snapshot_service = MithrilClientSnapshotService::new( - dep_builder.get_snapshot_client().await.unwrap(), - dep_builder.get_certificate_client().await.unwrap(), - dep_builder.get_certificate_verifier().await.unwrap(), - dep_builder.get_immutable_digester().await.unwrap(), - ); - - let digest = snapshot_service - .expand_eventual_snapshot_alias("LATEST") - .await - .expect("expand_eventual_snapshot_alias should not error when latest is passed as parameter."); - - assert_eq!("digest-1".to_string(), digest); - } - - #[tokio::test] - async fn expand_eventual_snapshot_alias_should_error() { - let mut http_client = MockAggregatorHTTPClient::new(); - http_client - .expect_get_content() - .returning(|_| Ok("[]".to_string())); - let mut dep_builder = get_dep_builder(Arc::new(http_client)); - let snapshot_service = MithrilClientSnapshotService::new( - dep_builder.get_snapshot_client().await.unwrap(), - dep_builder.get_certificate_client().await.unwrap(), - dep_builder.get_certificate_verifier().await.unwrap(), - dep_builder.get_immutable_digester().await.unwrap(), - ); - - let err = snapshot_service - .expand_eventual_snapshot_alias("latest") - .await - .expect_err( - "expand_eventual_snapshot_alias should returns an error if there is no latest.", - ); - - if let Some(e) = err.downcast_ref::() { - match e { - SnapshotServiceError::SnapshotNotFound(digest) => { - assert_eq!("latest", digest.as_str()); - } - _ => panic!("Wrong error type when snapshot could not be found {e:?}."), - } - } else { - panic!( - "Expected a SnapshotServiceError when snapshot can not be found. Got {err:?}: '{err}'" - ); - } - } -} diff --git a/mithril-client-cli/src/utils/expander.rs b/mithril-client-cli/src/utils/expander.rs new file mode 100644 index 00000000000..16893be9d80 --- /dev/null +++ b/mithril-client-cli/src/utils/expander.rs @@ -0,0 +1,92 @@ +use anyhow::anyhow; +use futures::Future; +use mithril_common::StdResult; + +/// Utilities to expand aliases into their associated ids. +pub struct ExpanderUtils; + +impl ExpanderUtils { + /// Expands an id alias to the latest id. + /// If the provided id is "latest", retrieves the list of ids using the given future and returns the first one. + /// Otherwise, returns the provided id as is. + pub async fn expand_eventual_id_alias( + id: &str, + get_list_of_ids: impl Future>>, + ) -> StdResult { + if id.to_lowercase() == "latest" { + let list = get_list_of_ids.await?; + let last_element = list.first().ok_or_else(|| anyhow!("Entity not found"))?; + Ok(last_element.to_string()) + } else { + Ok(id.to_string()) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + async fn get_list_of_ids(ids: Vec<&str>) -> StdResult> { + Ok(ids.iter().map(|h| h.to_string()).collect::>()) + } + + #[tokio::test] + async fn expand_eventual_id_alias_should_returns_id() { + let hash = ExpanderUtils::expand_eventual_id_alias( + "hash-234", + get_list_of_ids(vec!["hash-123", "hash-234", "hash-345"]), + ) + .await + .expect("expand_eventual_id_alias should not error when hash-234 is passed as parameter."); + + assert_eq!("hash-234", hash); + } + + #[tokio::test] + async fn expand_eventual_id_alias_latest_lowercase() { + let hash = ExpanderUtils::expand_eventual_id_alias( + "latest", + get_list_of_ids(vec!["hash-123", "hash-234", "hash-345"]), + ) + .await + .expect("expand_eventual_id_alias should not error when latest is passed as parameter."); + + assert_eq!("hash-123".to_string(), hash); + } + + #[tokio::test] + async fn expand_eventual_id_alias_latest_uppercase() { + let hash = ExpanderUtils::expand_eventual_id_alias( + "LATEST", + get_list_of_ids(vec!["hash-123", "hash-234", "hash-345"]), + ) + .await + .expect("expand_eventual_id_alias should not error when latest is passed as parameter."); + + assert_eq!("hash-123".to_string(), hash); + } + + #[tokio::test] + async fn expand_eventual_id_alias_should_error_if_list_is_empty() { + let _ = ExpanderUtils::expand_eventual_id_alias("LATEST", get_list_of_ids(vec![])) + .await + .expect_err( + "expand_eventual_id_alias should returns an error if returned list is empty.", + ); + } + + #[tokio::test] + async fn expand_eventual_id_alias_should_return_id_even_if_not_in_list() { + let hash = ExpanderUtils::expand_eventual_id_alias( + "hash-whatever", + get_list_of_ids(vec!["hash-123", "hash-234", "hash-345"]), + ) + .await + .expect( + "expand_eventual_id_alias should not error when hash-whatever is passed as parameter.", + ); + + assert_eq!("hash-whatever".to_string(), hash); + } +} diff --git a/mithril-client-cli/src/utils/feedback_receiver.rs b/mithril-client-cli/src/utils/feedback_receiver.rs new file mode 100644 index 00000000000..992220deede --- /dev/null +++ b/mithril-client-cli/src/utils/feedback_receiver.rs @@ -0,0 +1,100 @@ +use async_trait::async_trait; +use indicatif::{ProgressBar, ProgressDrawTarget, ProgressState, ProgressStyle}; +use std::fmt::Write; +use tokio::sync::RwLock; + +use super::{DownloadProgressReporter, ProgressOutputType}; + +use mithril_client::feedback::{FeedbackReceiver, MithrilEvent}; + +/// Custom [FeedbackReceiver] for Snapshot to handle events sent +/// by the `mithril-client` library +pub struct IndicatifFeedbackReceiver { + download_progress_reporter: RwLock>, + certificate_validation_pb: RwLock>, + output_type: ProgressOutputType, +} + +impl IndicatifFeedbackReceiver { + /// [IndicatifFeedbackReceiver] constructor + pub fn new(output_type: ProgressOutputType) -> Self { + Self { + download_progress_reporter: RwLock::new(None), + certificate_validation_pb: RwLock::new(None), + output_type, + } + } +} + +#[async_trait] +impl FeedbackReceiver for IndicatifFeedbackReceiver { + async fn handle_event(&self, event: MithrilEvent) { + match event { + MithrilEvent::SnapshotDownloadStarted { + digest: _, + download_id: _, + size, + } => { + let pb = if self.output_type == ProgressOutputType::Tty { + ProgressBar::new(size) + } else { + ProgressBar::with_draw_target(Some(size), ProgressDrawTarget::hidden()) + }; + pb.set_style(ProgressStyle::with_template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({eta})") + .unwrap() + .with_key("eta", |state : &ProgressState, w: &mut dyn Write| write!(w, "{:.1}s", state.eta().as_secs_f64()).unwrap()) + .progress_chars("#>-")); + let mut download_progress_reporter = self.download_progress_reporter.write().await; + *download_progress_reporter = + Some(DownloadProgressReporter::new(pb, self.output_type)); + } + MithrilEvent::SnapshotDownloadProgress { + download_id: _, + downloaded_bytes, + size: _, + } => { + let download_progress_reporter = self.download_progress_reporter.read().await; + if let Some(progress_reporter) = download_progress_reporter.as_ref() { + progress_reporter.report(downloaded_bytes); + } + } + MithrilEvent::SnapshotDownloadCompleted { download_id: _ } => { + let mut download_progress_reporter = self.download_progress_reporter.write().await; + if let Some(progress_reporter) = download_progress_reporter.as_ref() { + progress_reporter.finish("Snapshot download completed"); + } + *download_progress_reporter = None; + } + MithrilEvent::CertificateChainValidationStarted { + certificate_chain_validation_id: _, + } => { + let pb = if self.output_type == ProgressOutputType::Tty { + ProgressBar::new_spinner() + } else { + ProgressBar::hidden() + }; + let mut certificate_validation_pb = self.certificate_validation_pb.write().await; + *certificate_validation_pb = Some(pb); + } + MithrilEvent::CertificateValidated { + certificate_chain_validation_id: _, + certificate_hash, + } => { + let certificate_validation_pb = self.certificate_validation_pb.read().await; + if let Some(progress_bar) = certificate_validation_pb.as_ref() { + progress_bar.set_message(format!("Certificate '{certificate_hash}' is valid")); + progress_bar.inc(1); + } + } + MithrilEvent::CertificateChainValidated { + certificate_chain_validation_id: _, + } => { + let mut certificate_validation_pb = self.certificate_validation_pb.write().await; + if let Some(progress_bar) = certificate_validation_pb.as_ref() { + progress_bar.finish_with_message("Certificate chain validated"); + } + *certificate_validation_pb = None; + } + } + } +} diff --git a/mithril-client-cli/src/utils/mod.rs b/mithril-client-cli/src/utils/mod.rs index c16d9a711fd..969fa60d471 100644 --- a/mithril-client-cli/src/utils/mod.rs +++ b/mithril-client-cli/src/utils/mod.rs @@ -1,10 +1,14 @@ //! Utilities module -//! This module contains tools needed mostly in services layers. +//! This module contains tools needed for the commands layer. +mod expander; +mod feedback_receiver; mod progress_reporter; -mod stream_reader; +mod snapshot; mod unpacker; +pub use expander::*; +pub use feedback_receiver::*; pub use progress_reporter::*; -pub use stream_reader::*; +pub use snapshot::*; pub use unpacker::*; diff --git a/mithril-client-cli/src/utils/progress_reporter.rs b/mithril-client-cli/src/utils/progress_reporter.rs index 2b7b7f887d8..d85b835b594 100644 --- a/mithril-client-cli/src/utils/progress_reporter.rs +++ b/mithril-client-cli/src/utils/progress_reporter.rs @@ -1,3 +1,4 @@ +use chrono::Utc; use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget}; use mithril_common::StdResult; use slog_scope::warn; @@ -13,7 +14,7 @@ pub enum ProgressOutputType { /// Output to json JsonReporter, /// Output to tty - TTY, + Tty, /// No output Hidden, } @@ -22,7 +23,7 @@ impl From for ProgressDrawTarget { fn from(value: ProgressOutputType) -> Self { match value { ProgressOutputType::JsonReporter => ProgressDrawTarget::hidden(), - ProgressOutputType::TTY => ProgressDrawTarget::stdout(), + ProgressOutputType::Tty => ProgressDrawTarget::stdout(), ProgressOutputType::Hidden => ProgressDrawTarget::hidden(), } } @@ -49,10 +50,11 @@ impl ProgressPrinter { pub fn report_step(&self, step_number: u16, text: &str) -> StdResult<()> { match self.output_type { ProgressOutputType::JsonReporter => println!( - r#"{{"step_num": {step_number}, "total_steps": {}, "message": "{text}"}}"#, - self.number_of_steps + r#"{{"timestamp": "{timestamp}", "step_num": {step_number}, "total_steps": {number_of_steps}, "message": "{text}"}}"#, + timestamp = Utc::now().to_rfc3339(), + number_of_steps = self.number_of_steps, ), - ProgressOutputType::TTY => self + ProgressOutputType::Tty => self .multi_progress .println(format!("{step_number}/{} - {text}", self.number_of_steps))?, ProgressOutputType::Hidden => (), @@ -70,6 +72,25 @@ impl Deref for ProgressPrinter { } } +/// Utility to format a [ProgressBar] status as json +pub struct ProgressBarJsonFormatter; + +impl ProgressBarJsonFormatter { + /// Get a json formatted string given the progress bar status + pub fn format(progress_bar: &ProgressBar) -> String { + format!( + r#"{{"timestamp": "{}", "bytes_downloaded": {}, "bytes_total": {}, "seconds_left": {}.{:0>3}, "seconds_elapsed": {}.{:0>3}}}"#, + Utc::now().to_rfc3339(), + progress_bar.position(), + progress_bar.length().unwrap_or(0), + progress_bar.eta().as_secs(), + progress_bar.eta().subsec_millis(), + progress_bar.elapsed().as_secs(), + progress_bar.elapsed().subsec_millis(), + ) + } +} + /// Wrapper of a indicatif [ProgressBar] to allow reporting to json. pub struct DownloadProgressReporter { progress_bar: ProgressBar, @@ -78,7 +99,7 @@ pub struct DownloadProgressReporter { } impl DownloadProgressReporter { - /// Instanciate a new progress reporter + /// Instantiate a new progress reporter pub fn new(progress_bar: ProgressBar, output_type: ProgressOutputType) -> Self { Self { progress_bar, @@ -98,15 +119,7 @@ impl DownloadProgressReporter { }; if should_report { - println!( - r#"{{ "bytesDownloaded": {}, "bytesTotal": {}, "secondsLeft": {}.{}, "secondsElapsed": {}.{} }}"#, - self.progress_bar.position(), - self.progress_bar.length().unwrap_or(0), - self.progress_bar.eta().as_secs(), - self.progress_bar.eta().subsec_millis(), - self.progress_bar.elapsed().as_secs(), - self.progress_bar.elapsed().subsec_millis(), - ); + println!("{}", ProgressBarJsonFormatter::format(&self.progress_bar)); match self.last_json_report_instant.write() { Ok(mut instant) => *instant = Some(Instant::now()), @@ -118,6 +131,11 @@ impl DownloadProgressReporter { }; } + /// Report that the current download is finished and print the given message. + pub fn finish(&self, message: &str) { + self.progress_bar.finish_with_message(message.to_string()); + } + fn get_remaining_time_since_last_json_report(&self) -> Option { match self.last_json_report_instant.read() { Ok(instant) => (*instant).map(|instant| instant.elapsed()), @@ -125,3 +143,75 @@ impl DownloadProgressReporter { } } } + +#[cfg(test)] +mod tests { + use std::thread::sleep; + + use super::*; + use indicatif::ProgressBar; + + #[test] + fn check_seconds_elapsed_in_json_report_with_more_than_100_milliseconds() { + let progress_bar = ProgressBar::new(10).with_elapsed(Duration::from_millis(5124)); + + let json_string = ProgressBarJsonFormatter::format(&progress_bar); + + assert!( + json_string.contains(r#""seconds_elapsed": 5.124"#), + "Not expected value in json output: {}", + json_string + ); + } + + #[test] + fn check_seconds_elapsed_in_json_report_with_less_than_100_milliseconds() { + let progress_bar = ProgressBar::new(10).with_elapsed(Duration::from_millis(5004)); + + let json_string = ProgressBarJsonFormatter::format(&progress_bar); + + assert!( + json_string.contains(r#""seconds_elapsed": 5.004"#), + "Not expected value in json output: {}", + json_string + ); + } + + #[test] + fn check_seconds_left_in_json_report_with_more_than_100_milliseconds() { + let half_position = 5; + let progress_bar = ProgressBar::new(half_position * 2); + sleep(Duration::from_millis(123)); + progress_bar.set_position(half_position); + let json_string = ProgressBarJsonFormatter::format(&progress_bar); + + let milliseconds = progress_bar.eta().subsec_millis(); + assert!(milliseconds > 100); + assert!( + json_string.contains(&format!(r#""seconds_left": 0.{}"#, milliseconds)), + "Not expected value in json output: {}", + json_string + ); + } + + #[test] + fn check_seconds_left_in_json_report_with_less_than_100_milliseconds() { + let half_position = 5; + let progress_bar = ProgressBar::new(half_position * 2); + sleep(Duration::from_millis(1)); + progress_bar.set_position(half_position); + let json_string = ProgressBarJsonFormatter::format(&progress_bar); + + assert!( + json_string.contains(r#""seconds_left": 0.0"#), + "Not expected value in json output: {}", + json_string + ); + + assert!( + !json_string.contains(r#""seconds_left": 0.000"#), + "Not expected value in json output: {}", + json_string + ); + } +} diff --git a/mithril-client-cli/src/utils/snapshot.rs b/mithril-client-cli/src/utils/snapshot.rs new file mode 100644 index 00000000000..674951e7dd6 --- /dev/null +++ b/mithril-client-cli/src/utils/snapshot.rs @@ -0,0 +1,84 @@ +use anyhow::anyhow; +use futures::Future; +use indicatif::{MultiProgress, ProgressBar}; +use std::time::Duration; + +use super::SnapshotUnpackerError; +use mithril_client::MithrilResult; +use mithril_common::{StdError, StdResult}; + +/// Utility functions for to the Snapshot commands +pub struct SnapshotUtils; + +impl SnapshotUtils { + /// Handle the error return by `check_prerequisites` + pub fn check_disk_space_error(error: StdError) -> StdResult { + if let Some(SnapshotUnpackerError::NotEnoughSpace { + left_space: _, + pathdir: _, + archive_size: _, + }) = error.downcast_ref::() + { + Ok(format!("Warning: {}", error)) + } else { + Err(error) + } + } + + /// Display a spinner while waiting for the result of a future + pub async fn wait_spinner( + progress_bar: &MultiProgress, + future: impl Future>, + ) -> MithrilResult { + let pb = progress_bar.add(ProgressBar::new_spinner()); + let spinner = async move { + loop { + pb.tick(); + tokio::time::sleep(Duration::from_millis(50)).await; + } + }; + + tokio::select! { + _ = spinner => Err(anyhow!("timeout")), + res = future => res, + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use std::path::PathBuf; + + #[test] + fn check_disk_space_error_should_return_warning_message_if_error_is_not_enough_space() { + let not_enough_space_error = SnapshotUnpackerError::NotEnoughSpace { + left_space: 1_f64, + pathdir: PathBuf::new(), + archive_size: 2_f64, + }; + let expected = format!("Warning: {}", not_enough_space_error); + + let result = SnapshotUtils::check_disk_space_error(anyhow!(not_enough_space_error)) + .expect("check_disk_space_error should not error"); + + assert!(result.contains(&expected)); + } + + #[test] + fn check_disk_space_error_should_return_error_if_error_is_not_error_not_enough_space() { + let error = SnapshotUnpackerError::UnpackDirectoryAlreadyExists(PathBuf::new()); + + let error = SnapshotUtils::check_disk_space_error(anyhow!(error)) + .expect_err("check_disk_space_error should fail"); + + assert!( + matches!( + error.downcast_ref::(), + Some(SnapshotUnpackerError::UnpackDirectoryAlreadyExists(_)) + ), + "Unexpected error: {:?}", + error + ); + } +} diff --git a/mithril-client-cli/src/utils/stream_reader.rs b/mithril-client-cli/src/utils/stream_reader.rs deleted file mode 100644 index a624d517737..00000000000 --- a/mithril-client-cli/src/utils/stream_reader.rs +++ /dev/null @@ -1,35 +0,0 @@ -use flume::Receiver; -use std::io; - -// Credits and many thanks to https://stackoverflow.com/a/69967522 for most of this code - -/// A channel receiver that implement [io::Read]. -pub struct StreamReader { - receiver: Receiver>, - current: io::Cursor>, -} - -impl StreamReader { - /// [StreamReader] factory - pub fn new(receiver: Receiver>) -> Self { - Self { - receiver, - current: io::Cursor::new(vec![]), - } - } -} - -impl io::Read for StreamReader { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - if self.current.position() == self.current.get_ref().len() as u64 { - // We've exhausted the previous chunk, get a new one. - if let Ok(vec) = self.receiver.recv() { - self.current = io::Cursor::new(vec); - } - // If recv() "fails", it means the sender closed its part of - // the channel, which means EOF. Propagate EOF by allowing - // a read from the exhausted cursor. - } - self.current.read(buf) - } -} diff --git a/mithril-client-cli/src/utils/unpacker.rs b/mithril-client-cli/src/utils/unpacker.rs index 3939f542101..be189467685 100644 --- a/mithril-client-cli/src/utils/unpacker.rs +++ b/mithril-client-cli/src/utils/unpacker.rs @@ -1,15 +1,10 @@ -use anyhow::Context; -use flate2::read::GzDecoder; -use flume::Receiver; use human_bytes::human_bytes; use std::{ fs::{create_dir_all, remove_dir}, path::{Path, PathBuf}, }; -use tar::Archive; use thiserror::Error; -use crate::utils::StreamReader; use mithril_common::{entities::CompressionAlgorithm, StdError, StdResult}; /// Check and unpack a downloaded archive in a given directory. @@ -41,29 +36,17 @@ pub enum SnapshotUnpackerError { UnpackDirectoryAlreadyExists(PathBuf), /// Cannot write in the given directory. - #[error("Unpack directory '{0}' is not writable.")] + #[error("Unpack directory '{0}' is not writable, please check own or parents' permissions and ownership.")] UnpackDirectoryIsNotWritable(PathBuf, #[source] StdError), - - /// Unpacking error - #[error("Could not unpack from streamed data snapshot to directory '{dirpath}'")] - UnpackFailed { - /// Location where the archive is to be extracted. - dirpath: PathBuf, - - /// Subsystem error - #[source] - error: StdError, - }, } impl SnapshotUnpacker { /// Check all prerequisites are met before starting to download and unpack /// big snapshot archive. pub fn check_prerequisites( - &self, pathdir: &Path, size: u64, - compressionn_algorithm: CompressionAlgorithm, + compression_algorithm: CompressionAlgorithm, ) -> StdResult<()> { if pathdir.exists() { return Err( @@ -74,9 +57,10 @@ impl SnapshotUnpacker { SnapshotUnpackerError::UnpackDirectoryIsNotWritable(pathdir.to_owned(), e.into()) })?; let free_space = fs2::available_space(pathdir)? as f64; + // `remove_dir` doesn't remove intermediate directories that could have been created by `create_dir_all` remove_dir(pathdir)?; - if free_space < compressionn_algorithm.free_space_snapshot_ratio() * size as f64 { + if free_space < compression_algorithm.free_space_snapshot_ratio() * size as f64 { return Err(SnapshotUnpackerError::NotEnoughSpace { left_space: free_space, pathdir: pathdir.to_owned(), @@ -87,40 +71,100 @@ impl SnapshotUnpacker { Ok(()) } +} - /// Unpack the snapshot from the given stream into the given directory. - pub fn unpack_snapshot( - &self, - stream: Receiver>, - compression_algorithm: CompressionAlgorithm, - unpack_dir: &Path, - ) -> StdResult<()> { - let input = StreamReader::new(stream); - - match compression_algorithm { - CompressionAlgorithm::Gzip => { - let gzip_decoder = GzDecoder::new(input); - let mut snapshot_archive = Archive::new(gzip_decoder); - snapshot_archive.unpack(unpack_dir).map_err(|e| { - SnapshotUnpackerError::UnpackFailed { - dirpath: unpack_dir.to_owned(), - error: e.into(), - } - })?; - } - CompressionAlgorithm::Zstandard => { - let zstandard_decoder = zstd::Decoder::new(input) - .with_context(|| "Unpack failed: Create Zstandard decoder error")?; - let mut snapshot_archive = Archive::new(zstandard_decoder); - snapshot_archive.unpack(unpack_dir).map_err(|e| { - SnapshotUnpackerError::UnpackFailed { - dirpath: unpack_dir.to_owned(), - error: e.into(), - } - })?; - } - }; +#[cfg(test)] +mod test { + use super::*; + use mithril_common::entities::CompressionAlgorithm; + use std::fs::remove_dir_all; - Ok(()) + fn create_temporary_empty_directory(name: &str) -> PathBuf { + let pathdir = std::env::temp_dir().join(name); + if pathdir.exists() { + remove_dir_all(&pathdir).unwrap(); + } + create_dir_all(&pathdir).unwrap(); + pathdir + } + + #[test] + fn should_return_ok() { + let pathdir = create_temporary_empty_directory("return_ok").join("target_directory"); + + SnapshotUnpacker::check_prerequisites(&pathdir, 12, CompressionAlgorithm::default()) + .expect("check_prerequisites should not fail"); + } + + #[test] + fn should_return_error_if_unpack_directory_already_exists() { + let pathdir = create_temporary_empty_directory("existing_directory"); + + let error = + SnapshotUnpacker::check_prerequisites(&pathdir, 12, CompressionAlgorithm::default()) + .expect_err("check_prerequisites should fail"); + + assert!( + matches!( + error.downcast_ref::(), + Some(SnapshotUnpackerError::UnpackDirectoryAlreadyExists(_)) + ), + "Unexpected error: {:?}", + error + ); + } + + // This test is not run on Windows because `set_readonly` is not working on Windows 7+ + // https://doc.rust-lang.org/std/fs/struct.Permissions.html#method.set_readonly + #[cfg(not(target_os = "windows"))] + #[test] + fn should_return_error_if_directory_could_not_be_created() { + let pathdir = create_temporary_empty_directory("read_only_directory"); + + let mut perms = std::fs::metadata(&pathdir).unwrap().permissions(); + perms.set_readonly(true); + std::fs::set_permissions(&pathdir, perms).unwrap(); + + let targetdir = pathdir.join("target_directory"); + + let error = + SnapshotUnpacker::check_prerequisites(&targetdir, 12, CompressionAlgorithm::default()) + .expect_err("check_prerequisites should fail"); + + assert!( + matches!( + error.downcast_ref::(), + Some(SnapshotUnpackerError::UnpackDirectoryIsNotWritable(_, _)) + ), + "Unexpected error: {:?}", + error + ); + } + + #[test] + fn should_return_error_if_not_enough_available_space() { + let pathdir = + create_temporary_empty_directory("enough_available_space").join("target_directory"); + let archive_size = u64::MAX; + + let error = SnapshotUnpacker::check_prerequisites( + &pathdir, + archive_size, + CompressionAlgorithm::default(), + ) + .expect_err("check_prerequisites should fail"); + + assert!( + matches!( + error.downcast_ref::(), + Some(SnapshotUnpackerError::NotEnoughSpace { + left_space: _, + pathdir: _, + archive_size: _ + }) + ), + "Unexpected error: {:?}", + error + ); } } diff --git a/mithril-client-wasm/.gitignore b/mithril-client-wasm/.gitignore new file mode 100644 index 00000000000..6103cc2220a --- /dev/null +++ b/mithril-client-wasm/.gitignore @@ -0,0 +1,3 @@ +target/ +.DS_Store + diff --git a/mithril-client-wasm/.vsls.json b/mithril-client-wasm/.vsls.json new file mode 100644 index 00000000000..69ba4b16330 --- /dev/null +++ b/mithril-client-wasm/.vsls.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json.schemastore.org/vsls", + "hideFiles": [ + "!www", + "!pkg" + ] +} \ No newline at end of file diff --git a/mithril-client-wasm/Cargo.toml b/mithril-client-wasm/Cargo.toml new file mode 100644 index 00000000000..275835cd6da --- /dev/null +++ b/mithril-client-wasm/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "mithril-client-wasm" +version = "0.1.9" +description = "Mithril client WASM" +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +categories = ["cryptography"] + +[lib] +crate-type = ["cdylib"] + +[dependencies] +async-trait = "0.1.77" +futures = "0.3.30" +mithril-client = { path = "../mithril-client" } +serde = { version = "1.0.196", features = ["derive"] } +serde-wasm-bindgen = "0.6.3" +wasm-bindgen = "0.2.90" +wasm-bindgen-futures = "0.4.40" +web-sys = { version = "0.3.67", features = ["BroadcastChannel"] } + +[dev-dependencies] +wasm-bindgen-test = "0.3.40" + +[features] +# Include nothing by default +default = [] + +[package.metadata.docs.rs] +all-features = true +# enable unstable features in the documentation +rustdoc-args = ["--cfg", "docsrs"] diff --git a/mithril-client-wasm/Makefile b/mithril-client-wasm/Makefile new file mode 100644 index 00000000000..2d1f0cc389e --- /dev/null +++ b/mithril-client-wasm/Makefile @@ -0,0 +1,46 @@ +%: + @: + +.PHONY: all build test check clean doc + +args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}` + +CARGO = cargo + +all: test build + +build: + wasm-pack build --target web --release --out-name index + +test: + pkill -f "mithril-aggregator-fake" || true + ${CARGO} run -p mithril-aggregator-fake -- -p 8000 & + if wasm-pack test --headless --firefox --chrome --node --release; then \ + pkill -f "mithril-aggregator-fake" || true; \ + else \ + pkill -f "mithril-aggregator-fake" || true; \ + exit 1; \ + fi + +check: + ${CARGO} check --release --all-features --all-targets + ${CARGO} clippy --release --all-features --all-targets + ${CARGO} fmt --check + +clean: + ${CARGO} clean + +doc: + ${CARGO} doc --no-deps --open --features full + +www-install: + npm --prefix www install + +www-serve: + npm --prefix www run start + +www-test-install: + npm --prefix www-test install + +www-test-serve: + npm --prefix www-test run start diff --git a/mithril-client-wasm/README.md b/mithril-client-wasm/README.md new file mode 100644 index 00000000000..6351992fdea --- /dev/null +++ b/mithril-client-wasm/README.md @@ -0,0 +1,89 @@ +# Mithril-client-wasm ![cnpm](https://img.shields.io/npm/v/@mithril-dev/mithril-client-wasm.svg) [![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](LICENSE-APACHE) [![Discord](https://img.shields.io/discord/500028886025895936.svg?logo=discord&style=flat-square)](https://discord.gg/5kaErDKDRq) + +**This is a work in progress** 🛠 + +* `mithril-client-wasm` defines all the tooling necessary to manipulate Mithril certified types available from a Mithril aggregator from a WASM compatible browser. + +* The different types of available data certified by Mithril are: + * Snapshot: list and get. + * Mithril stake distribution: list and get. + * Certificate: list, get, and chain validation. + +## Installation +- Install a correctly configured Rust toolchain (latest stable version). You can follow the instructions provided [here](https://www.rust-lang.org/learn/get-started). + +- Install Rust WASM Pack: +```bash +cargo install wasm-pack +``` + +- Install **clang**: +```bash +sudo apt install clang +``` + +- Install `nodejs` version `16.15+` +```bash +sudo apt install nodejs +``` + +- Install `npm` version `8.11+` +```bash +sudo apt install npm +``` + +> [!WARNING] +> If you have troubles building the `BLST` library, you will need to: +> - Install [`Emscripten`](https://emscripten.org/docs/getting_started/downloads.html) +> - For macOS users, consider reading this [guide](https://github.com/emscripten-core/emscripten/issues/5696) to activate the `emcc` command +> - Use these environment variables to use this compiler (or prefix all following commands with them): +> ```bash +> export CC=emcc +> export AR=emar +> ``` + +## Build Mithril client library in WASM + +Go to the `mithril-client-wasm` directory: +```bash +cd mithril-client-wasm +``` + +Then you can build the WASM library: +```bash +make build +``` + +## Run the Mithril client library in the browser + +You will need to run the Mithril client library in a compatible browser: + +| Browser | Minimum version | Released | Tested in CI | +| --- |:---:|:---:|:---:| +| **Chrome** | `54` | 2016-10-12 | :heavy_check_mark: | +| **Edge** | `79` | 2020-01-15 | - | +| **Firefox** | `38` | 2015-05-12 | :heavy_check_mark: | +| **Opera** | `41` | 2016-10-25 | - | +| **Safari** | `15.4` | 2022-03-14 | - | +| **Chrome Android** | `54` | 2016-10-19 | - | +| **Firefox for Android** | `38` | 2015-05-12 | - | +| **Opera Android** | `41` | 2016-10-25 | - | +| **Safari on iOS** | `15.4` | 2022-03-14 | - | + + +Go to the `mithril-client-wasm` directory: +```bash +cd mithril-client-wasm +``` + +Install the library: +```bash +make www-install +``` + +Then you can serve the Mithril client library in the browser: +```bash +make www-serve +``` + +Finally, open [http://localhost:8080](http://localhost:8080) with your browser. (port 8080 is the default port) \ No newline at end of file diff --git a/mithril-client-wasm/npm/README.md b/mithril-client-wasm/npm/README.md new file mode 100644 index 00000000000..cc6f92f636a --- /dev/null +++ b/mithril-client-wasm/npm/README.md @@ -0,0 +1,95 @@ +# Mithril-client-wasm ![cnpm](https://img.shields.io/npm/v/@mithril-dev/mithril-client-wasm.svg) [![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](LICENSE-APACHE) [![Discord](https://img.shields.io/discord/500028886025895936.svg?logo=discord&style=flat-square)](https://discord.gg/5kaErDKDRq) + +**This is a work in progress** 🛠 + +* `mithril-client-wasm` defines all the tooling necessary to manipulate Mithril certified types available from a Mithril aggregator from a WASM compatible browser. + +* The different types of available data certified by Mithril are: + * Snapshot: list and get. + * Mithril stake distribution: list and get. + * Certificate: list, get, and chain validation. + +## Example + +Below is a basic example of how to use most of the functions exposed by the Mithril client WASM library: + +```javascript +import initMithrilClient, { MithrilClient } from "@mithril-dev/mithril-client-wasm" + +let aggregator_endpoint = + "https://aggregator.testing-preview.api.mithril.network/aggregator" +let genesis_verification_key = + "5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d" + +const broadcast_channel = new BroadcastChannel("mithril-client"); +broadcast_channel.onmessage = (e) => { + let event = e.data; + if (event.type == "CertificateChainValidationStarted") { + console.log("The certificate chain validation has started"); + } else if (event.type == "CertificateValidated") { + console.log("A certificate has been validated, certificate_hash: " + event.payload.certificate_hash); + } else if (event.type == "CertificateChainValidated") { + console.log("The certificate chain is valid"); + } else { + console.log(event); + } +}; + +await initMithrilClient(); + +let client = await new MithrilClient( + aggregator_endpoint, + genesis_verification_key +) +let mithril_stake_distributions_list = await client.list_mithril_stake_distributions(); +console.log("stake distributions:", mithril_stake_distributions_list); + +let last_mithril_stake_distribution = mithril_stake_distributions_list[0]; +console.log("last_mithril_stake_distribution:", last_mithril_stake_distribution); + +let last_stake_distribution = await client.get_mithril_stake_distribution(last_mithril_stake_distribution.hash); +console.log("last_stake_distribution:", last_stake_distribution); + +let certificate = await client.get_mithril_certificate(last_stake_distribution.certificate_hash); +console.log("certificate:", certificate); + +let last_certificate_from_chain = await client.verify_certificate_chain(certificate.hash); +console.log("verify certificate chain OK, last_certificate_from_chain:", last_certificate_from_chain); + +let mithril_stake_distributions_message = await client.compute_mithril_stake_distribution_message(last_stake_distribution); +console.log("mithril_stake_distributions_message:", mithril_stake_distributions_message); + +let valid_stake_distribution_message = await client.verify_message_match_certificate(mithril_stake_distributions_message, last_certificate_from_chain); +console.log("valid_stake_distribution_message:", valid_stake_distribution_message); +``` + +## Browser Compatiblity + +The Mithril client library is compatible with the following browsers: + +| Browser | Minimum version | Released | Tested in CI | +| --- |:---:|:---:|:---:| +| **Chrome** | `54` | 2016-10-12 | :heavy_check_mark: | +| **Edge** | `79` | 2020-01-15 | - | +| **Firefox** | `38` | 2015-05-12 | :heavy_check_mark: | +| **Opera** | `41` | 2016-10-25 | - | +| **Safari** | `15.4` | 2022-03-14 | - | +| **Chrome Android** | `54` | 2016-10-19 | - | +| **Firefox for Android** | `38` | 2015-05-12 | - | +| **Opera Android** | `41` | 2016-10-25 | - | +| **Safari on iOS** | `15.4` | 2022-03-14 | - | + +## Getting Help +First, check our [Developer documentation](https://mithril.network/doc/manual/developer-docs/nodes/mithril-client-wasm-library). + +If you need more information, feel free to join IOG's Technical Community [discord server](https://discord.gg/5kaErDKDRq). + +## Contributing + +Thanks for considering contributing and help us on creating the Mithril protocol! + +The best way to contribute right now is to try things out and provide feedback, +but we also accept contributions to the documentation and obviously to the +code itself. + +When contributing to this project and interacting with others, please follow our [Code of Conduct](https://github.com/input-output-hk/mithril/blob/main/CODE-OF-CONDUCT.md) and our [Contributing Guidelines](https://github.com/input-output-hk/mithril/blob/main/CONTRIBUTING.md). \ No newline at end of file diff --git a/mithril-client-wasm/src/client_wasm.rs b/mithril-client-wasm/src/client_wasm.rs new file mode 100644 index 00000000000..f87efeeb48e --- /dev/null +++ b/mithril-client-wasm/src/client_wasm.rs @@ -0,0 +1,392 @@ +use async_trait::async_trait; +use mithril_client::{ + feedback::{FeedbackReceiver, MithrilEvent}, + Client, ClientBuilder, MessageBuilder, MithrilCertificate, +}; +use serde::Serialize; +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +type WasmResult = Result; + +#[wasm_bindgen] +struct JSBroadcastChannelFeedbackReceiver { + channel: String, +} + +impl JSBroadcastChannelFeedbackReceiver { + pub fn new(channel: &str) -> Self { + Self { + channel: channel.to_string(), + } + } +} + +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] +impl FeedbackReceiver for JSBroadcastChannelFeedbackReceiver { + async fn handle_event(&self, event: MithrilEvent) { + let event = MithrilEventWasm::from(event); + let _ = web_sys::BroadcastChannel::new(&self.channel) + .unwrap() + .post_message(&serde_wasm_bindgen::to_value(&event).unwrap()); + } +} + +#[derive(Serialize)] +struct MithrilEventWasm { + #[serde(rename = "type")] + event_type: String, + #[serde(rename = "payload")] + event_data: MithrilEvent, +} + +impl From for MithrilEventWasm { + fn from(event: MithrilEvent) -> Self { + Self { + event_type: event.to_string(), + event_data: event, + } + } +} + +/// Structure that wraps a [Client] and enables its functions to be used in WASM +#[wasm_bindgen] +pub struct MithrilClient { + client: Client, +} + +#[wasm_bindgen] +impl MithrilClient { + /// Constructor for wasm client + #[wasm_bindgen(constructor)] + pub fn new(aggregator_endpoint: &str, genesis_verification_key: &str) -> MithrilClient { + let feedback_receiver = Arc::new(JSBroadcastChannelFeedbackReceiver::new("mithril-client")); + let client = ClientBuilder::aggregator(aggregator_endpoint, genesis_verification_key) + .add_feedback_receiver(feedback_receiver) + .build() + .map_err(|err| format!("{err:?}")) + .unwrap(); + MithrilClient { client } + } + + /// Call the client to get a snapshot from a digest + #[wasm_bindgen] + pub async fn get_snapshot(&self, digest: &str) -> WasmResult { + let result = self + .client + .snapshot() + .get(digest) + .await + .map_err(|err| format!("{err:?}"))? + .ok_or(JsValue::from_str(&format!( + "No snapshot found for digest: '{digest}'" + )))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client to get the list of available snapshots + #[wasm_bindgen] + pub async fn list_snapshots(&self) -> WasmResult { + let result = self + .client + .snapshot() + .list() + .await + .map_err(|err| format!("{err:?}"))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client to get a mithril stake distribution from a hash + #[wasm_bindgen] + pub async fn get_mithril_stake_distribution(&self, hash: &str) -> WasmResult { + let result = self + .client + .mithril_stake_distribution() + .get(hash) + .await + .map_err(|err| format!("{err:?}"))? + .ok_or(JsValue::from_str(&format!( + "No mithril stake distribution found for hash: '{hash}'" + )))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client for the list of available mithril stake distributions + #[wasm_bindgen] + pub async fn list_mithril_stake_distributions(&self) -> WasmResult { + let result = self + .client + .mithril_stake_distribution() + .list() + .await + .map_err(|err| format!("{err:?}"))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client to compute a mithril stake distribution message + #[wasm_bindgen] + pub async fn compute_mithril_stake_distribution_message( + &self, + stake_distribution: JsValue, + ) -> WasmResult { + let stake_distribution = + serde_wasm_bindgen::from_value(stake_distribution).map_err(|err| format!("{err:?}"))?; + let result = MessageBuilder::new() + .compute_mithril_stake_distribution_message(&stake_distribution) + .map_err(|err| format!("{err:?}"))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client to verify a mithril stake distribution message + #[wasm_bindgen] + pub async fn verify_message_match_certificate( + &self, + message: JsValue, + certificate: JsValue, + ) -> WasmResult { + let certificate: MithrilCertificate = + serde_wasm_bindgen::from_value(certificate).map_err(|err| format!("{err:?}"))?; + let message = serde_wasm_bindgen::from_value(message).map_err(|err| format!("{err:?}"))?; + + Ok(JsValue::from(certificate.match_message(&message))) + } + + /// Call the client to get a mithril certificate from a certificate hash + #[wasm_bindgen] + pub async fn get_mithril_certificate(&self, hash: &str) -> WasmResult { + let result = self + .client + .certificate() + .get(hash) + .await + .map_err(|err| format!("{err:?}"))? + .ok_or(JsValue::from_str(&format!( + "No certificate found for hash: '{hash}'" + )))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client for the list of available mithril certificates + #[wasm_bindgen] + pub async fn list_mithril_certificates(&self) -> WasmResult { + let result = self + .client + .certificate() + .list() + .await + .map_err(|err| format!("{err:?}"))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } + + /// Call the client to verify the certificate chain from a certificate hash + #[wasm_bindgen] + pub async fn verify_certificate_chain(&self, hash: &str) -> WasmResult { + let result = self + .client + .certificate() + .verify_chain(hash) + .await + .map_err(|err| format!("{err:?}"))?; + + Ok(serde_wasm_bindgen::to_value(&result)?) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use mithril_client::{ + common::ProtocolMessage, MithrilCertificateListItem, MithrilStakeDistribution, + MithrilStakeDistributionListItem, Snapshot, SnapshotListItem, + }; + use wasm_bindgen_test::*; + + const GENESIS_VERIFICATION_KEY: &str = "5b33322c3235332c3138362c3230312c3137372c31312c3131372c3133352c3138372c3136372c3138312c3138382c32322c35392c3230362c3130352c3233312c3135302c3231352c33302c37382c3231322c37362c31362c3235322c3138302c37322c3133342c3133372c3234372c3136312c36385d"; + const FAKE_AGGREGATOR_IP: &str = "127.0.0.1"; + const FAKE_AGGREGATOR_PORT: &str = "8000"; + const FAKE_AGGREGATOR_SNAPSHOT_DIGEST: &str = + "000ee4c84c7b64a62dc30ec78a765a1f3bb81cd9dd4bd1eccf9f2da785e70877"; + const FAKE_AGGREGATOR_MSD_HASH: &str = + "03ebb00e6626037f2e58eb7cc50d308fd57c253baa1fe2b04eb5945ced16b5bd"; + const FAKE_CERTIFICATE_HASH: &str = + "05bf6740e781e649dd2fe7e3319818747d8038ca759c67711c90cf24cdade8a9"; + + fn get_mithril_client() -> MithrilClient { + MithrilClient::new( + &format!( + "http://{}:{}/aggregator", + FAKE_AGGREGATOR_IP, FAKE_AGGREGATOR_PORT + ), + GENESIS_VERIFICATION_KEY, + ) + } + + wasm_bindgen_test_configure!(run_in_browser); + #[wasm_bindgen_test] + async fn list_snapshots_should_return_value_convertible_in_rust_type() { + let snapshots_list_js_value = get_mithril_client() + .list_snapshots() + .await + .expect("list_snapshots should not fail"); + let snapshots_list = + serde_wasm_bindgen::from_value::>(snapshots_list_js_value) + .expect("conversion should not fail"); + + assert_eq!(snapshots_list.len(), 3); + } + + #[wasm_bindgen_test] + async fn get_snapshot_should_return_value_convertible_in_rust_type() { + let snapshot_js_value = get_mithril_client() + .get_snapshot(FAKE_AGGREGATOR_SNAPSHOT_DIGEST) + .await + .expect("get_snapshot should not fail"); + let snapshot = serde_wasm_bindgen::from_value::(snapshot_js_value) + .expect("conversion should not fail"); + + assert_eq!(snapshot.digest, FAKE_AGGREGATOR_SNAPSHOT_DIGEST); + } + + #[wasm_bindgen_test] + async fn get_snapshot_should_fail_with_unknown_digest() { + get_mithril_client() + .get_snapshot("whatever") + .await + .expect_err("get_snapshot should fail"); + } + + #[wasm_bindgen_test] + async fn list_mithril_stake_distributions_should_return_value_convertible_in_rust_type() { + let msd_list_js_value = get_mithril_client() + .list_mithril_stake_distributions() + .await + .expect("list_mithril_stake_distributions should not fail"); + let msd_list = serde_wasm_bindgen::from_value::>( + msd_list_js_value, + ) + .expect("conversion should not fail"); + + assert_eq!(msd_list.len(), 3); + } + + #[wasm_bindgen_test] + async fn get_mithril_stake_distribution_should_return_value_convertible_in_rust_type() { + let msd_js_value = get_mithril_client() + .get_mithril_stake_distribution(FAKE_AGGREGATOR_MSD_HASH) + .await + .expect("get_mithril_stake_distribution should not fail"); + let msd = serde_wasm_bindgen::from_value::(msd_js_value) + .expect("conversion should not fail"); + + assert_eq!(msd.hash, FAKE_AGGREGATOR_MSD_HASH); + } + + #[wasm_bindgen_test] + async fn get_mithril_stake_distribution_should_fail_with_unknown_hash() { + get_mithril_client() + .get_mithril_stake_distribution("whatever") + .await + .expect_err("get_mithril_stake_distribution should fail"); + } + + #[wasm_bindgen_test] + async fn list_mithril_certificates_should_return_value_convertible_in_rust_type() { + let certificates_list_js_value = get_mithril_client() + .list_mithril_certificates() + .await + .expect("list_mithril_certificates should not fail"); + let certificates_list = serde_wasm_bindgen::from_value::>( + certificates_list_js_value, + ) + .expect("conversion should not fail"); + + assert_eq!(certificates_list.len(), 7); + } + + #[wasm_bindgen_test] + async fn get_mithril_certificate_should_return_value_convertible_in_rust_type() { + let certificate_js_value = get_mithril_client() + .get_mithril_certificate(FAKE_CERTIFICATE_HASH) + .await + .expect("get_mithril_certificate should not fail"); + let certificate = + serde_wasm_bindgen::from_value::(certificate_js_value) + .expect("conversion should not fail"); + + assert_eq!(certificate.hash, FAKE_CERTIFICATE_HASH); + } + + #[wasm_bindgen_test] + async fn get_mithril_certificate_should_fail_with_unknown_hash() { + get_mithril_client() + .get_mithril_certificate("whatever") + .await + .expect_err("get_mithril_certificate should fail"); + } + + #[wasm_bindgen_test] + async fn compute_mithril_stake_distribution_message_should_return_value_convertible_in_rust_type( + ) { + let client = get_mithril_client(); + let msd_js_value = client + .get_mithril_stake_distribution(FAKE_AGGREGATOR_MSD_HASH) + .await + .unwrap(); + + let message_js_value = client + .compute_mithril_stake_distribution_message(msd_js_value) + .await + .expect("compute_mithril_stake_distribution_message should not fail"); + serde_wasm_bindgen::from_value::(message_js_value) + .expect("conversion should not fail"); + } + + #[wasm_bindgen_test] + async fn verify_certificate_chain_should_return_value_convertible_in_rust_type() { + let client = get_mithril_client(); + let msd_js_value = client + .get_mithril_stake_distribution(FAKE_AGGREGATOR_MSD_HASH) + .await + .unwrap(); + let msd = serde_wasm_bindgen::from_value::(msd_js_value).unwrap(); + + let certificate_js_value = client + .verify_certificate_chain(&msd.certificate_hash) + .await + .expect("verify_certificate_chain should not fail"); + serde_wasm_bindgen::from_value::(certificate_js_value) + .expect("conversion should not fail"); + } + + #[wasm_bindgen_test] + async fn verify_message_match_certificate_should_return_true() { + let client = get_mithril_client(); + let msd_js_value = client + .get_mithril_stake_distribution(FAKE_AGGREGATOR_MSD_HASH) + .await + .unwrap(); + let msd = serde_wasm_bindgen::from_value::(msd_js_value.clone()) + .unwrap(); + let last_certificate_js_value = client + .verify_certificate_chain(&msd.certificate_hash) + .await + .unwrap(); + let message_js_value = client + .compute_mithril_stake_distribution_message(msd_js_value) + .await + .unwrap(); + + client + .verify_message_match_certificate(message_js_value, last_certificate_js_value) + .await + .expect("verify_message_match_certificate should not fail"); + } +} diff --git a/mithril-client-wasm/src/lib.rs b/mithril-client-wasm/src/lib.rs new file mode 100644 index 00000000000..5863f26cc4c --- /dev/null +++ b/mithril-client-wasm/src/lib.rs @@ -0,0 +1,5 @@ +#![warn(missing_docs)] +//! Implementation of the 'mithril-client' library in WASM +mod client_wasm; + +pub use client_wasm::MithrilClient; diff --git a/mithril-client-wasm/www-test/.gitignore b/mithril-client-wasm/www-test/.gitignore new file mode 100644 index 00000000000..9c97bbd46d2 --- /dev/null +++ b/mithril-client-wasm/www-test/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +.env diff --git a/mithril-client-wasm/www-test/README.md b/mithril-client-wasm/www-test/README.md new file mode 100644 index 00000000000..04f7bfc24dc --- /dev/null +++ b/mithril-client-wasm/www-test/README.md @@ -0,0 +1,29 @@ +# Mithril client wasm: www-test + +* A set of tests for the Mithril client WASM library, which is a client for interacting with a Mithril network. The tests cover functionalities provided by the MithrilClient class. + +## Download source code + +```bash +# Download sources from github +git clone https://github.com/input-output-hk/mithril + +# Go to sources directory +cd mithril-client-wasm/ +``` + +* Before running the tests, make sure to install the required dependencies. Use the following command: + +```bash +make www-test-install +``` + +## Running the tests in the browser + +```bash +make www-test-serve +``` + +## Test Results Display + +The results of each test are displayed in the DOM dynamically. Open [http://localhost:8080](http://localhost:8080) with your browser. (port 8080 is the default port) \ No newline at end of file diff --git a/mithril-client-wasm/www-test/bootstrap.js b/mithril-client-wasm/www-test/bootstrap.js new file mode 100644 index 00000000000..7934d627e82 --- /dev/null +++ b/mithril-client-wasm/www-test/bootstrap.js @@ -0,0 +1,5 @@ +// A dependency graph that contains any wasm must all be imported +// asynchronously. This `bootstrap.js` file does the single async import, so +// that no one else needs to worry about it again. +import("./index.js") + .catch(e => console.error("Error importing `index.js`:", e)); diff --git a/mithril-client-wasm/www-test/index.html b/mithril-client-wasm/www-test/index.html new file mode 100644 index 00000000000..7fb7cbc20a7 --- /dev/null +++ b/mithril-client-wasm/www-test/index.html @@ -0,0 +1,10 @@ + + + + + Hello wasm-pack! + + + + + diff --git a/mithril-client-wasm/www-test/index.js b/mithril-client-wasm/www-test/index.js new file mode 100644 index 00000000000..3f216987667 --- /dev/null +++ b/mithril-client-wasm/www-test/index.js @@ -0,0 +1,127 @@ +import initMithrilClient, { + MithrilClient, +} from "@mithril-dev/mithril-client-wasm"; + +async function run_test(test_name, test_number, fun) { + try { + const result = await fun(); + display_test_result_in_dom(test_name, test_number, "OK"); + return result; + } catch (error) { + handle_error(test_name, test_number, error); + } +} + +function display_test_result_in_dom(test_name, test_number, result, error) { + let div = document.createElement("div"); + div.id = test_name; + div.title = result; + div.innerHTML = `Result test n°${test_number}: ${result}; function_name: ${test_name}${ + error ? `; reason: ${error}` : "" + }`; + document.body.appendChild(div); +} + +function handle_error(test_name, test_number, error) { + display_test_result_in_dom(test_name, test_number, "FAILED", error); + console.error(`Error at step ${test_number} (${test_name}):`, error); + add_finished_div(); + throw new Error( + `Stopping script due to error at step ${test_number}: ${error}` + ); +} + +function add_finished_div() { + let div = document.createElement("div"); + div.id = "tests_finished"; + document.body.appendChild(div); +} + +await initMithrilClient(); +const aggregator_endpoint = process.env.AGGREGATOR_ENDPOINT; +const genesis_verification_key = process.env.GENESIS_VERIFICATION_KEY; +let client; +let test_number = 1; + +await run_test("constructor", test_number, async () => { + client = new MithrilClient(aggregator_endpoint, genesis_verification_key); +}); + +let snapshots; +test_number++; +await run_test("list_snapshots", test_number, async () => { + snapshots = await client.list_snapshots(); + console.log("snapshots", snapshots); +}); + +test_number++; +await run_test("get_snapshot", test_number, async () => { + const snapshot = await client.get_snapshot(snapshots[0].digest); + console.log("snapshot", snapshot); +}); + +let mithril_stake_distributions; +test_number++; +await run_test("list_mithril_stake_distributions", test_number, async () => { + mithril_stake_distributions = await client.list_mithril_stake_distributions(); + console.log("mithril_stake_distributions", mithril_stake_distributions); +}); + +let mithril_stake_distribution; +test_number++; +await run_test("get_mithril_stake_distribution", test_number, async () => { + mithril_stake_distribution = await client.get_mithril_stake_distribution( + mithril_stake_distributions[0].hash + ); + console.log("mithril_stake_distribution", mithril_stake_distribution); +}); + +let certificate; +test_number++; +await run_test("get_mithril_certificate", test_number, async () => { + certificate = await client.get_mithril_certificate( + mithril_stake_distribution.certificate_hash + ); + console.log("certificate", certificate); +}); + +let last_certificate_from_chain; +test_number++; +await run_test("verify_certificate_chain", test_number, async () => { + last_certificate_from_chain = await client.verify_certificate_chain( + certificate.hash + ); + console.log("last_certificate_from_chain", last_certificate_from_chain); +}); + +let mithril_stake_distribution_message; +test_number++; +await run_test( + "compute_mithril_stake_distribution_message", + test_number, + async () => { + mithril_stake_distribution_message = + await client.compute_mithril_stake_distribution_message( + mithril_stake_distribution + ); + console.log( + "mithril_stake_distribution_message", + mithril_stake_distribution_message + ); + } +); + +test_number++; +await run_test("verify_message_match_certificate", test_number, async () => { + const valid_stake_distribution_message = + await client.verify_message_match_certificate( + mithril_stake_distribution_message, + last_certificate_from_chain + ); + console.log( + "valid_stake_distribution_message", + valid_stake_distribution_message + ); +}); + +add_finished_div(); diff --git a/mithril-client-wasm/www-test/package-lock.json b/mithril-client-wasm/www-test/package-lock.json new file mode 100644 index 00000000000..022a590f1d5 --- /dev/null +++ b/mithril-client-wasm/www-test/package-lock.json @@ -0,0 +1,4359 @@ +{ + "name": "www-test", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "www-test", + "version": "0.1.0", + "dependencies": { + "@mithril-dev/mithril-client-wasm": "file:../pkg" + }, + "devDependencies": { + "copy-webpack-plugin": "^5.0.0", + "dotenv-webpack": "^8.0.1", + "webpack": "^5.88.2", + "webpack-cli": "^4.7.2", + "webpack-dev-server": "^4.15.1" + } + }, + "../pkg": { + "name": "mithril-client-wasm", + "version": "0.1.8", + "license": "Apache-2.0" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mithril-dev/mithril-client-wasm": { + "resolved": "../pkg", + "link": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", + "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001580", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", + "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-defaults": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", + "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", + "dev": true, + "dependencies": { + "dotenv": "^8.2.0" + } + }, + "node_modules/dotenv-webpack": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz", + "integrity": "sha512-CdrgfhZOnx4uB18SgaoP9XHRN2v48BbjuXQsZY5ixs5A8579NxQkmMxRtI7aTwSiSQcM2ao12Fdu+L3ZS3bG4w==", + "dev": true, + "dependencies": { + "dotenv-defaults": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "^4 || ^5" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.645", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.645.tgz", + "integrity": "sha512-EeS1oQDCmnYsRDRy2zTeC336a/4LZ6WKqvSaM1jLocEk5ZuyszkQtCpsqvuvaIXGOUjwtvF6LTcS8WueibXvSw==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "deprecated": "This module is no longer supported.", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "pkg": { + "name": "mithril-client-wasm", + "version": "0.1.7", + "extraneous": true, + "license": "Apache-2.0" + } + } +} diff --git a/mithril-client-wasm/www-test/package.json b/mithril-client-wasm/www-test/package.json new file mode 100644 index 00000000000..77709516d42 --- /dev/null +++ b/mithril-client-wasm/www-test/package.json @@ -0,0 +1,19 @@ +{ + "name": "www-test", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "webpack --config webpack.config.js", + "start": "webpack-dev-server" + }, + "dependencies": { + "@mithril-dev/mithril-client-wasm": "file:../pkg" + }, + "devDependencies": { + "copy-webpack-plugin": "^5.0.0", + "dotenv-webpack": "^8.0.1", + "webpack": "^5.88.2", + "webpack-cli": "^4.7.2", + "webpack-dev-server": "^4.15.1" + } +} diff --git a/mithril-client-wasm/www-test/webpack.config.js b/mithril-client-wasm/www-test/webpack.config.js new file mode 100644 index 00000000000..3ecf010210f --- /dev/null +++ b/mithril-client-wasm/www-test/webpack.config.js @@ -0,0 +1,16 @@ +const CopyWebpackPlugin = require("copy-webpack-plugin") +const path = require("path") +const Dotenv = require("dotenv-webpack") + +module.exports = { + entry: "./bootstrap.js", + output: { + path: path.resolve(__dirname, "dist"), + filename: "bootstrap.js", + }, + mode: "development", + plugins: [new CopyWebpackPlugin(["index.html"]), new Dotenv()], + experiments: { + asyncWebAssembly: true, + }, +} diff --git a/mithril-client-wasm/www/.gitignore b/mithril-client-wasm/www/.gitignore new file mode 100644 index 00000000000..f06235c460c --- /dev/null +++ b/mithril-client-wasm/www/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/mithril-client-wasm/www/bootstrap.js b/mithril-client-wasm/www/bootstrap.js new file mode 100644 index 00000000000..7934d627e82 --- /dev/null +++ b/mithril-client-wasm/www/bootstrap.js @@ -0,0 +1,5 @@ +// A dependency graph that contains any wasm must all be imported +// asynchronously. This `bootstrap.js` file does the single async import, so +// that no one else needs to worry about it again. +import("./index.js") + .catch(e => console.error("Error importing `index.js`:", e)); diff --git a/mithril-client-wasm/www/index.html b/mithril-client-wasm/www/index.html new file mode 100644 index 00000000000..a34e1faee4b --- /dev/null +++ b/mithril-client-wasm/www/index.html @@ -0,0 +1,15 @@ + + + + + + Mithril client WASM example + + + + +

Mithril client WASM example

+ + + + \ No newline at end of file diff --git a/mithril-client-wasm/www/index.js b/mithril-client-wasm/www/index.js new file mode 100644 index 00000000000..09e742d327a --- /dev/null +++ b/mithril-client-wasm/www/index.js @@ -0,0 +1,74 @@ +import initMithrilClient, { MithrilClient } from "@mithril-dev/mithril-client-wasm" + +let aggregator_endpoint = + "https://aggregator.testing-preview.api.mithril.network/aggregator" +let genesis_verification_key = + "5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d" + +const broadcast_channel = new BroadcastChannel("mithril-client"); +broadcast_channel.onmessage = (e) => { + let event = e.data; + if (event.type == "CertificateChainValidationStarted") { + displayMessageInDOM(event.type, "The certificate chain validation has started"); + } else if (event.type == "CertificateValidated") { + displayMessageInDOM(event.type, "A certificate has been validated, certificate_hash: " + event.payload.certificate_hash); + } else if (event.type == "CertificateChainValidated") { + displayMessageInDOM(event.type, "The certificate chain is valid"); + } else { + displayMessageInDOM(event); + } +}; + +function displayMessageInDOM(subject, message) { + let div = document.createElement('div'); + div.innerHTML = '' + subject + ': ' + message; + document.body.appendChild(div); + window.scrollTo(0, document.body.scrollHeight); + console.log(message); +} + +function displayStepInDOM(number, content) { + let div = document.createElement('div'); + div.innerHTML = '

Step n°' + number + ':

' + '' + content + ''; + document.body.appendChild(div); +} + +await initMithrilClient(); + +let client = new MithrilClient( + aggregator_endpoint, + genesis_verification_key +) + +displayStepInDOM(1, "Getting stake distributions list..."); +let mithril_stake_distributions_list = await client.list_mithril_stake_distributions(); +displayMessageInDOM("Result", "got " + mithril_stake_distributions_list.length + " stake distributions ✓"); +console.log("stake distributions:", mithril_stake_distributions_list); + +let last_mithril_stake_distribution = mithril_stake_distributions_list[0]; +console.log("last_mithril_stake_distribution:", last_mithril_stake_distribution); + +displayStepInDOM(2, "Getting last stake distribution with hash: " + last_mithril_stake_distribution.hash + "..."); +let last_stake_distribution = await client.get_mithril_stake_distribution(last_mithril_stake_distribution.hash); +displayMessageInDOM("Result", "got last stake distribution ✓"); +console.log("last_stake_distribution:", last_stake_distribution); + +displayStepInDOM(3, "Getting Mithril certificate from certificate hash: " + last_stake_distribution.certificate_hash + "..."); +let certificate = await client.get_mithril_certificate(last_stake_distribution.certificate_hash); +displayMessageInDOM("Result", "got Mithril certificate ✓"); +console.log("certificate:", certificate); + +displayStepInDOM(4, "Verifying certificate chain..."); +let last_certificate_from_chain = await client.verify_certificate_chain(certificate.hash); +displayMessageInDOM("Result", "certificate chain verified ✓"); +console.log("verify_certificate_chain OK, last_certificate_from_chain:", last_certificate_from_chain); + +displayStepInDOM(5, "Computing the Mithril stake distribution message..."); +let mithril_stake_distributions_message = await client.compute_mithril_stake_distribution_message(last_stake_distribution); +displayMessageInDOM("Result", "Mithril stake distribution message computed ✓"); +console.log("mithril_stake_distributions_message:", mithril_stake_distributions_message); + +displayStepInDOM(6, "Validating Mithril stake distribution message..."); +let valid_stake_distribution_message = await client.verify_message_match_certificate(mithril_stake_distributions_message, last_certificate_from_chain); +displayMessageInDOM("Result", "Mithril stake distribution message validated ✓"); +console.log("valid_stake_distribution_message:", valid_stake_distribution_message); \ No newline at end of file diff --git a/mithril-client-wasm/www/package-lock.json b/mithril-client-wasm/www/package-lock.json new file mode 100644 index 00000000000..9849a3807b9 --- /dev/null +++ b/mithril-client-wasm/www/package-lock.json @@ -0,0 +1,4319 @@ +{ + "name": "www", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "www", + "version": "0.1.0", + "dependencies": { + "@mithril-dev/mithril-client-wasm": "file:../pkg" + }, + "devDependencies": { + "copy-webpack-plugin": "^5.0.0", + "webpack": "^5.88.2", + "webpack-cli": "^4.7.2", + "webpack-dev-server": "^4.15.1" + } + }, + "../pkg": { + "name": "mithril-client-wasm", + "version": "0.1.8", + "license": "Apache-2.0" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mithril-dev/mithril-client-wasm": { + "resolved": "../pkg", + "link": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz", + "integrity": "sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz", + "integrity": "sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.651", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz", + "integrity": "sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "deprecated": "This module is no longer supported.", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/mithril-client-wasm/www/package.json b/mithril-client-wasm/www/package.json new file mode 100644 index 00000000000..cb2e730560f --- /dev/null +++ b/mithril-client-wasm/www/package.json @@ -0,0 +1,18 @@ +{ + "name": "www", + "version": "0.1.1", + "private": true, + "scripts": { + "build": "webpack --config webpack.config.js", + "start": "webpack-dev-server" + }, + "dependencies": { + "@mithril-dev/mithril-client-wasm": "file:../pkg" + }, + "devDependencies": { + "webpack": "^5.88.2", + "webpack-cli": "^4.7.2", + "webpack-dev-server": "^4.15.1", + "copy-webpack-plugin": "^5.0.0" + } +} diff --git a/mithril-client-wasm/www/webpack.config.js b/mithril-client-wasm/www/webpack.config.js new file mode 100644 index 00000000000..aeca35eb45f --- /dev/null +++ b/mithril-client-wasm/www/webpack.config.js @@ -0,0 +1,20 @@ +const CopyWebpackPlugin = require("copy-webpack-plugin"); +const path = require('path'); + +module.exports = { + entry: "./bootstrap.js", + output: { + path: path.resolve(__dirname, "dist"), + filename: "bootstrap.js", + }, + mode: "development", + plugins: [ + new CopyWebpackPlugin(['index.html']) + ], + experiments: { + asyncWebAssembly: true + }, + devServer: { + allowedHosts: [".mithril.network"] + } +}; diff --git a/mithril-client/.gitignore b/mithril-client/.gitignore index e08c79410a5..6103cc2220a 100644 --- a/mithril-client/.gitignore +++ b/mithril-client/.gitignore @@ -1,2 +1,3 @@ target/ .DS_Store + diff --git a/mithril-client/Cargo.toml b/mithril-client/Cargo.toml index ef4a6e9ce1b..64728dad1be 100644 --- a/mithril-client/Cargo.toml +++ b/mithril-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client" -version = "0.5.11" +version = "0.6.1" description = "Mithril client library" authors = { workspace = true } edition = { workspace = true } @@ -18,51 +18,54 @@ name = "snapshot_list_get_show_download_verify" path = "tests/snapshot_list_get_show_download_verify.rs" required-features = ["fs"] +[[test]] +name = "cardano_transaction_proof" +path = "tests/cardano_transaction_proof.rs" +required-features = ["unstable"] + [dependencies] -anyhow = "1.0.75" +anyhow = "1.0.79" async-recursion = "1.0.5" -async-trait = "0.1.73" -chrono = { version = "0.4.31", features = ["serde"] } -flate2 = { version = "1.0.27", optional = true } +async-trait = "0.1.77" +chrono = { version = "0.4.33", features = ["serde"] } +flate2 = { version = "1.0.28", optional = true } flume = { version = "0.11.0", optional = true } -futures = "0.3.28" -reqwest = { version = "0.11.22", features = ["json", "stream"] } -semver = "1.0.19" -serde = { version = "1.0.188", features = ["derive"] } -serde_json = "1.0.107" +futures = "0.3.30" +reqwest = { version = "0.11.23", features = ["json", "stream"] } +semver = "1.0.21" +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.113" slog = "2.7.0" +strum = { version = "0.26.1", features = ["derive"] } tar = { version = "0.4.40", optional = true } -thiserror = "1.0.49" -tokio = { version = "1.32.0", features = ["sync"] } -uuid = { version = "1.5.0", features = ["v4"] } +thiserror = "1.0.56" +tokio = { version = "1.35.1", features = ["sync"] } +uuid = { version = "1.7.0", features = ["v4"] } zstd = { version = "0.13.0", optional = true } [target.'cfg(not(target_family = "wasm"))'.dependencies] -mithril-common = { path = "../mithril-common", version = "0.2", features = [ +mithril-common = { path = "../mithril-common", version = "=0.3", features = [ "fs", ] } [target.'cfg(target_family = "wasm")'.dependencies] -getrandom = { version = "0.2", features = ["js"] } -mithril-common = { path = "../mithril-common", version = "0.2" } -reqwest = { version = "0.11.22", features = ["json", "stream"] } -serde-wasm-bindgen = "0.6.0" -wasm-bindgen = "0.2" -wasm-bindgen-futures = "0.4.37" +getrandom = { version = "0.2.12", features = ["js"] } +mithril-common = { path = "../mithril-common", version = "=0.3" } +reqwest = { version = "0.11.23", features = ["json", "stream"] } [dev-dependencies] -httpmock = "0.6.8" +httpmock = "0.7.0" indicatif = { version = "0.17.7", features = ["tokio"] } -mithril-common = { path = "../mithril-common", version = "0.2", features = [ +mithril-common = { path = "../mithril-common", version = "=0.3", features = [ "random", "test_tools", ] } -mockall = "0.11.4" +mockall = "0.12.1" slog-async = "2.8.0" slog-scope = "4.4.0" slog-term = "2.9.0" -tokio = { version = "1.32.0", features = ["macros", "rt"] } -warp = "0.3" +tokio = { version = "1.35.1", features = ["macros", "rt"] } +warp = "0.3.6" [features] # Include nothing by default @@ -74,6 +77,7 @@ full = ["fs"] # Enable file system releated functionnality, right now that mean ony snapshot download fs = ["flate2", "flume", "tar", "tokio/rt", "zstd"] portable = ["mithril-common/portable"] +unstable = [] [package.metadata.docs.rs] all-features = true diff --git a/mithril-client/Makefile b/mithril-client/Makefile index 53a25ac2ac3..da93a8dacad 100644 --- a/mithril-client/Makefile +++ b/mithril-client/Makefile @@ -26,6 +26,3 @@ clean: doc: ${CARGO} doc --no-deps --open --features full - -build-wasm: - wasm-pack build --release diff --git a/mithril-client/README.md b/mithril-client/README.md index a144d5228f2..2e10fcfab48 100644 --- a/mithril-client/README.md +++ b/mithril-client/README.md @@ -5,7 +5,7 @@ * `mithril-client` defines all the tooling necessary to manipulate Mithril certified types available from a Mithril aggregator. * The different types of available data certified by Mithril are: - * Snapshot: list, get and download tarball. + * Snapshot: list, get, download tarball and record statistics. * Mithril stake distribution: list and get. * Certificate: list, get, and chain validation. @@ -37,6 +37,10 @@ async fn main() -> mithril_client::MithrilResult<()> { .snapshot() .download_unpack(&snapshot, target_directory) .await?; + + if let Err(e) = client.snapshot().add_statistics(&snapshot).await { + println!("Could not increment snapshot download statistics: {:?}", e); + } let message = MessageBuilder::new() .compute_snapshot_message(&certificate, target_directory) diff --git a/mithril-client/src/aggregator_client.rs b/mithril-client/src/aggregator_client.rs index d71dda89408..f070fcf2c41 100644 --- a/mithril-client/src/aggregator_client.rs +++ b/mithril-client/src/aggregator_client.rs @@ -68,6 +68,30 @@ pub enum AggregatorRequest { }, /// Lists the aggregator [snapshots][crate::Snapshot] ListSnapshots, + + /// Increments the aggregator snapshot download statistics + IncrementSnapshotStatistic { + /// Snapshot as HTTP request body + snapshot: String, + }, + + /// Get proofs that the given set of Cardano transactions is included in the global Cardano transactions set + #[cfg(feature = "unstable")] + GetTransactionsProofs { + /// Hashes of the transactions to get proofs for. + transactions_hashes: Vec, + }, + + /// Get a specific [Cardano transaction commitment][crate::CardanoTransactionCommitment] + #[cfg(feature = "unstable")] + GetCardanoTransactionCommitment { + /// Hash of the Cardano transaction commitment to retrieve + hash: String, + }, + + /// Lists the aggregator [Cardano transaction commitment][crate::CardanoTransactionCommitment] + #[cfg(feature = "unstable")] + ListCardanoTransactionCommitments, } impl AggregatorRequest { @@ -88,22 +112,56 @@ impl AggregatorRequest { format!("artifact/snapshot/{}", digest) } AggregatorRequest::ListSnapshots => "artifact/snapshots".to_string(), + AggregatorRequest::IncrementSnapshotStatistic { snapshot: _ } => { + "statistics/snapshot".to_string() + } + #[cfg(feature = "unstable")] + AggregatorRequest::GetTransactionsProofs { + transactions_hashes, + } => format!( + "proof/cardano-transaction?transaction_hashes={}", + transactions_hashes.join(",") + ), + #[cfg(feature = "unstable")] + AggregatorRequest::GetCardanoTransactionCommitment { hash } => { + format!("artifact/cardano-transaction/{hash}") + } + #[cfg(feature = "unstable")] + AggregatorRequest::ListCardanoTransactionCommitments => { + "artifact/cardano-transactions".to_string() + } + } + } + + /// Get the request body to send to the aggregator + pub fn get_body(&self) -> Option { + match self { + AggregatorRequest::IncrementSnapshotStatistic { snapshot } => { + Some(snapshot.to_string()) + } + _ => None, } } } /// API that defines a client for the Aggregator -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] pub trait AggregatorClient: Sync + Send { /// Get the content back from the Aggregator async fn get_content( &self, request: AggregatorRequest, ) -> Result; + + /// Post information to the Aggregator + async fn post_content( + &self, + request: AggregatorRequest, + ) -> Result; } -/// Responsible of HTTP transport and API version check. +/// Responsible for HTTP transport and API version check. pub struct AggregatorHTTPClient { http_client: reqwest::Client, aggregator_endpoint: Url, @@ -166,8 +224,8 @@ impl AggregatorHTTPClient { } /// Perform a HTTP GET request on the Aggregator and return the given JSON - #[cfg_attr(target_arch = "wasm32", async_recursion(?Send))] - #[cfg_attr(not(target_arch = "wasm32"), async_recursion)] + #[cfg_attr(target_family = "wasm", async_recursion(?Send))] + #[cfg_attr(not(target_family = "wasm"), async_recursion)] async fn get(&self, url: Url) -> Result { debug!(self.logger, "GET url='{url}'."); let request_builder = self.http_client.get(url.clone()); @@ -208,6 +266,49 @@ impl AggregatorHTTPClient { } } + #[cfg_attr(target_family = "wasm", async_recursion(?Send))] + #[cfg_attr(not(target_family = "wasm"), async_recursion)] + async fn post(&self, url: Url, json: &str) -> Result { + debug!(self.logger, "POST url='{url}' json='{json}'."); + let request_builder = self.http_client.post(url.to_owned()).body(json.to_owned()); + let current_api_version = self + .compute_current_api_version() + .await + .unwrap() + .to_string(); + debug!( + self.logger, + "Prepare request with version: {current_api_version}" + ); + let request_builder = + request_builder.header(MITHRIL_API_VERSION_HEADER, current_api_version); + + let response = request_builder.send().await.map_err(|e| { + AggregatorClientError::SubsystemError( + anyhow!(e).context("Error while POSTing data '{json}' to URL='{url}'."), + ) + })?; + + match response.status() { + StatusCode::OK | StatusCode::CREATED => Ok(response), + StatusCode::PRECONDITION_FAILED => { + if self.discard_current_api_version().await.is_some() + && !self.api_versions.read().await.is_empty() + { + return self.post(url, json).await; + } + + Err(self.handle_api_error(&response).await) + } + StatusCode::NOT_FOUND => Err(AggregatorClientError::RemoteServerLogical(anyhow!( + "Url='{url} not found" + ))), + status_code => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( + "Unhandled error {status_code}" + ))), + } + } + /// API version error handling async fn handle_api_error(&self, response: &Response) -> AggregatorClientError { if let Some(version) = response.headers().get(MITHRIL_API_VERSION_HEADER) { @@ -238,8 +339,8 @@ impl AggregatorHTTPClient { } #[cfg_attr(test, automock)] -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] impl AggregatorClient for AggregatorHTTPClient { async fn get_content( &self, @@ -254,6 +355,24 @@ impl AggregatorClient for AggregatorHTTPClient { ))) }) } + + async fn post_content( + &self, + request: AggregatorRequest, + ) -> Result { + let response = self + .post( + self.get_url_for_route(&request.route())?, + &request.get_body().unwrap_or_default(), + ) + .await?; + + response.text().await.map_err(|e| { + AggregatorClientError::SubsystemError( + anyhow!(e).context("Could not find a text body in the response."), + ) + }) + } } #[cfg(test)] @@ -281,4 +400,86 @@ mod tests { assert_eq!(expected, client.aggregator_endpoint.as_str()); } } + + #[test] + fn deduce_routes_from_request() { + assert_eq!( + "certificate/abc".to_string(), + AggregatorRequest::GetCertificate { + hash: "abc".to_string() + } + .route() + ); + + assert_eq!( + "artifact/mithril-stake-distribution/abc".to_string(), + AggregatorRequest::GetMithrilStakeDistribution { + hash: "abc".to_string() + } + .route() + ); + + assert_eq!( + "artifact/mithril-stake-distribution/abc".to_string(), + AggregatorRequest::GetMithrilStakeDistribution { + hash: "abc".to_string() + } + .route() + ); + + assert_eq!( + "artifact/mithril-stake-distributions".to_string(), + AggregatorRequest::ListMithrilStakeDistributions.route() + ); + + assert_eq!( + "artifact/snapshot/abc".to_string(), + AggregatorRequest::GetSnapshot { + digest: "abc".to_string() + } + .route() + ); + + assert_eq!( + "artifact/snapshots".to_string(), + AggregatorRequest::ListSnapshots.route() + ); + + assert_eq!( + "statistics/snapshot".to_string(), + AggregatorRequest::IncrementSnapshotStatistic { + snapshot: "abc".to_string() + } + .route() + ); + + #[cfg(feature = "unstable")] + { + assert_eq!( + "proof/cardano-transaction?transaction_hashes=abc,def,ghi,jkl".to_string(), + AggregatorRequest::GetTransactionsProofs { + transactions_hashes: vec![ + "abc".to_string(), + "def".to_string(), + "ghi".to_string(), + "jkl".to_string() + ] + } + .route() + ); + + assert_eq!( + "artifact/cardano-transaction/abc".to_string(), + AggregatorRequest::GetCardanoTransactionCommitment { + hash: "abc".to_string() + } + .route() + ); + + assert_eq!( + "artifact/cardano-transactions".to_string(), + AggregatorRequest::ListCardanoTransactionCommitments.route() + ); + } + } } diff --git a/mithril-client/src/cardano_transaction_proof_client.rs b/mithril-client/src/cardano_transaction_proof_client.rs new file mode 100644 index 00000000000..88c495679f1 --- /dev/null +++ b/mithril-client/src/cardano_transaction_proof_client.rs @@ -0,0 +1,284 @@ +//! A client to retrieve from an aggregator cryptographic proofs of membership for a subset of Cardano transactions. +//! +//! In order to do so it defines a [CardanoTransactionProofClient] which exposes the following features: +//! - [get_proofs][CardanoTransactionProofClient::get_proofs]: get a [cryptographic proof][CardanoTransactionsProofs] +//! that the transactions with given hash are included in the global Cardano transactions set. +//! - [get][CardanoTransactionProofClient::get]: get a [Cardano transaction commitment][CardanoTransactionCommitment] +//! data from its hash. +//! - [list][CardanoTransactionProofClient::list]: get the list of the latest available Cardano transaction +//! commitments. +//! +//! **Important:** Verifying a proof **only** means that its cryptography is valid, in order to certify that a Cardano +//! transactions subset is valid, the associated proof must be tied to a valid Mithril certificate (see the example below). +//! +//! # Get and verify Cardano transaction proof +//! +//! To get and verify a Cardano transaction proof using the [ClientBuilder][crate::client::ClientBuilder]. +//! +//! ```no_run +//! # async fn run() -> mithril_client::MithrilResult<()> { +//! use mithril_client::{ClientBuilder, MessageBuilder}; +//! +//! let client = ClientBuilder::aggregator("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").build()?; +//! +//! // 1 - Get a proof from the aggregator and verify it +//! let cardano_transaction_proof = client.cardano_transaction_proof().get_proofs(&["tx-1", "tx-2"]).await?; +//! println!("Mithril could not certify the following transactions : {:?}", &cardano_transaction_proof.non_certified_transactions); +//! +//! let verified_transactions = cardano_transaction_proof.verify()?; +//! +//! // 2 - Verify its associated certificate chain +//! let certificate = client.certificate().verify_chain(&cardano_transaction_proof.certificate_hash).await?; +//! +//! // 3 - Ensure that the proof is indeed signed in the associated certificate +//! let message = MessageBuilder::new().compute_cardano_transactions_proofs_message(&certificate, &verified_transactions); +//! if certificate.match_message(&message) { +//! // All green, Mithril certifies that those transactions are part of the Cardano transactions set. +//! println!("Certified transactions : {:?}", verified_transactions.certified_transactions()); +//! } +//! # Ok(()) +//! # } +//! ``` +//! +//! # Get a Cardano transaction commitment +//! +//! To get a Cardano transaction commitment using the [ClientBuilder][crate::client::ClientBuilder]. +//! +//! ```no_run +//! # async fn run() -> mithril_client::MithrilResult<()> { +//! use mithril_client::ClientBuilder; +//! +//! let client = ClientBuilder::aggregator("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").build()?; +//! let cardano_transaction_commitment = client.cardano_transaction_proof().get("CARDANO_TRANSACTION_COMMITMENT_HASH").await?.unwrap(); +//! +//! println!("Cardano transaction commitment hash={}, epoch={}", cardano_transaction_commitment.hash, cardano_transaction_commitment.beacon.epoch); +//! # Ok(()) +//! # } +//! ``` +//! +//! # List available Cardano transaction commitments +//! +//! To list latest available Cardano transaction commitments using the [ClientBuilder][crate::client::ClientBuilder]. +//! +//! ```no_run +//! # async fn run() -> mithril_client::MithrilResult<()> { +//! use mithril_client::ClientBuilder; +//! +//! let client = ClientBuilder::aggregator("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").build()?; +//! let cardano_transaction_commitments = client.cardano_transaction_proof().list().await?; +//! +//! for cardano_transaction_commitment in cardano_transaction_commitments { +//! println!("Cardano transaction commitment hash={}, epoch={}", cardano_transaction_commitment.hash, cardano_transaction_commitment.beacon.epoch); +//! } +//! # Ok(()) +//! # } +//! ``` + +use crate::aggregator_client::{AggregatorClient, AggregatorClientError, AggregatorRequest}; +use crate::{ + CardanoTransactionCommitment, CardanoTransactionCommitmentListItem, CardanoTransactionsProofs, + MithrilResult, +}; +use anyhow::Context; +use std::sync::Arc; + +/// HTTP client for CardanoTransactionsAPI from the Aggregator +pub struct CardanoTransactionProofClient { + aggregator_client: Arc, +} + +impl CardanoTransactionProofClient { + /// Constructs a new `CardanoTransactionProofClient`. + pub fn new(aggregator_client: Arc) -> Self { + Self { aggregator_client } + } + + /// Get proofs that the given subset of transactions is included in the Cardano transactions set. + pub async fn get_proofs( + &self, + transactions_hashes: &[&str], + ) -> MithrilResult { + match self + .aggregator_client + .get_content(AggregatorRequest::GetTransactionsProofs { + transactions_hashes: transactions_hashes.iter().map(|h| h.to_string()).collect(), + }) + .await + { + Ok(content) => { + let transactions_proofs: CardanoTransactionsProofs = serde_json::from_str(&content) + .with_context(|| { + "CardanoTransactionProof Client can not deserialize transactions proofs" + })?; + + Ok(transactions_proofs) + } + Err(e) => Err(e.into()), + } + } + + /// Fetch a list of signed Cardano transaction commitments. + pub async fn list(&self) -> MithrilResult> { + let response = self + .aggregator_client + .get_content(AggregatorRequest::ListCardanoTransactionCommitments) + .await + .with_context(|| { + "CardanoTransactionProofClient Client can not get the artifact list" + })?; + let items = serde_json::from_str::>(&response) + .with_context(|| { + "CardanoTransactionProofClient Client can not deserialize artifact list" + })?; + + Ok(items) + } + + /// Get the given Cardano transaction commitment data. If it cannot be found, a None is returned. + pub async fn get(&self, hash: &str) -> MithrilResult> { + match self + .aggregator_client + .get_content(AggregatorRequest::GetCardanoTransactionCommitment { + hash: hash.to_string(), + }) + .await + { + Ok(content) => { + let cardano_transaction_commitment: CardanoTransactionCommitment = + serde_json::from_str(&content).with_context(|| { + "CardanoTransactionProofClient Client can not deserialize artifact" + })?; + + Ok(Some(cardano_transaction_commitment)) + } + Err(AggregatorClientError::RemoteServerLogical(_)) => Ok(None), + Err(e) => Err(e.into()), + } + } +} + +#[cfg(test)] +mod tests { + use crate::aggregator_client::{AggregatorClientError, MockAggregatorHTTPClient}; + use crate::common::Beacon; + use crate::{ + CardanoTransactionCommitment, CardanoTransactionCommitmentListItem, + CardanoTransactionsProofs, CardanoTransactionsSetProof, + }; + use anyhow::anyhow; + use chrono::{DateTime, Utc}; + use std::sync::Arc; + + use super::*; + + fn fake_messages() -> Vec { + vec![ + CardanoTransactionCommitmentListItem { + merkle_root: "mk-123".to_string(), + beacon: Beacon::new("network".to_string(), 1, 1), + hash: "hash-123".to_string(), + certificate_hash: "cert-hash-123".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + }, + CardanoTransactionCommitmentListItem { + merkle_root: "mk-456".to_string(), + beacon: Beacon::new("network".to_string(), 1, 2), + hash: "hash-456".to_string(), + certificate_hash: "cert-hash-456".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + }, + ] + } + + #[tokio::test] + async fn get_cardano_transaction_commitment_list() { + let message = fake_messages(); + let mut http_client = MockAggregatorHTTPClient::new(); + http_client + .expect_get_content() + .return_once(move |_| Ok(serde_json::to_string(&message).unwrap())); + let client = CardanoTransactionProofClient::new(Arc::new(http_client)); + let items = client.list().await.unwrap(); + + assert_eq!(2, items.len()); + assert_eq!("hash-123".to_string(), items[0].hash); + assert_eq!("hash-456".to_string(), items[1].hash); + } + + #[tokio::test] + async fn get_cardano_transaction_commitment() { + let mut http_client = MockAggregatorHTTPClient::new(); + let message = CardanoTransactionCommitment { + merkle_root: "mk-123".to_string(), + beacon: Beacon::new("network".to_string(), 1, 1), + hash: "hash-123".to_string(), + certificate_hash: "cert-hash-123".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + }; + let expected = message.clone(); + http_client + .expect_get_content() + .return_once(move |_| Ok(serde_json::to_string(&message).unwrap())); + let client = CardanoTransactionProofClient::new(Arc::new(http_client)); + let cardano_transaction_commitment = client + .get("hash") + .await + .unwrap() + .expect("This test returns a cardano transaction commitment"); + + assert_eq!(expected, cardano_transaction_commitment); + } + + #[tokio::test] + async fn test_get_proof_ok() { + let mut aggregator_client = MockAggregatorHTTPClient::new(); + let certificate_hash = "cert-hash-123".to_string(); + let set_proof = CardanoTransactionsSetProof::dummy(); + let transactions_proofs = + CardanoTransactionsProofs::new(&certificate_hash, vec![set_proof.clone()], vec![]); + let expected_transactions_proofs = transactions_proofs.clone(); + aggregator_client + .expect_get_content() + .return_once(move |_| Ok(serde_json::to_string(&transactions_proofs).unwrap())) + .times(1); + + let cardano_tx_client = CardanoTransactionProofClient::new(Arc::new(aggregator_client)); + let transactions_proofs = cardano_tx_client + .get_proofs( + &set_proof + .transactions_hashes + .iter() + .map(|h| h.as_str()) + .collect::>(), + ) + .await + .unwrap(); + + assert_eq!(expected_transactions_proofs, transactions_proofs); + } + + #[tokio::test] + async fn test_get_proof_ko() { + let mut aggregator_client = MockAggregatorHTTPClient::new(); + aggregator_client + .expect_get_content() + .return_once(move |_| { + Err(AggregatorClientError::RemoteServerTechnical(anyhow!( + "an error" + ))) + }) + .times(1); + + let cardano_tx_client = CardanoTransactionProofClient::new(Arc::new(aggregator_client)); + cardano_tx_client + .get_proofs(&["tx-123"]) + .await + .expect_err("The certificate client should fail here."); + } +} diff --git a/mithril-client/src/certificate_client.rs b/mithril-client/src/certificate_client.rs index b7c85ecbaa2..476134fe9e8 100644 --- a/mithril-client/src/certificate_client.rs +++ b/mithril-client/src/certificate_client.rs @@ -87,8 +87,8 @@ pub struct CertificateClient { /// API that defines how to validate certificates. #[cfg_attr(test, automock)] -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] pub trait CertificateVerifier: Sync + Send { /// Validate the chain starting with the given certificate. async fn verify_chain(&self, certificate: &MithrilCertificate) -> MithrilResult<()>; @@ -224,8 +224,8 @@ impl MithrilCertificateVerifier { } } -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] impl CertificateVerifier for MithrilCertificateVerifier { async fn verify_chain(&self, certificate: &MithrilCertificate) -> MithrilResult<()> { // Todo: move most of this code in the `mithril_common` verifier by defining @@ -268,8 +268,8 @@ impl CertificateVerifier for MithrilCertificateVerifier { } } -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] impl CertificateRetriever for InternalCertificateRetriever { async fn get_certificate_details( &self, diff --git a/mithril-client/src/client.rs b/mithril-client/src/client.rs index 3a39969d434..1e3b50ea828 100644 --- a/mithril-client/src/client.rs +++ b/mithril-client/src/client.rs @@ -1,4 +1,12 @@ +use anyhow::{anyhow, Context}; +use mithril_common::api_version::APIVersionProvider; +use reqwest::Url; +use slog::{o, Logger}; +use std::sync::Arc; + use crate::aggregator_client::{AggregatorClient, AggregatorHTTPClient}; +#[cfg(feature = "unstable")] +use crate::cardano_transaction_proof_client::CardanoTransactionProofClient; use crate::certificate_client::{ CertificateClient, CertificateVerifier, MithrilCertificateVerifier, }; @@ -8,22 +16,25 @@ use crate::snapshot_client::SnapshotClient; #[cfg(feature = "fs")] use crate::snapshot_downloader::{HttpSnapshotDownloader, SnapshotDownloader}; use crate::MithrilResult; -use anyhow::{anyhow, Context}; -use mithril_common::api_version::APIVersionProvider; -use reqwest::Url; -use slog::{o, Logger}; -use std::sync::Arc; /// Structure that aggregates the available clients for each of the Mithril types of certified data. /// /// Use the [ClientBuilder] to instantiate it easily. pub struct Client { + #[cfg(feature = "unstable")] + cardano_transaction_proof_client: Arc, certificate_client: Arc, mithril_stake_distribution_client: Arc, snapshot_client: Arc, } impl Client { + /// Get the client that fetches and verifies Mithril Cardano transaction proof. + #[cfg(feature = "unstable")] + pub fn cardano_transaction_proof(&self) -> Arc { + self.cardano_transaction_proof_client.clone() + } + /// Get the client that fetches and verifies Mithril certificates. pub fn certificate(&self) -> Arc { self.certificate_client.clone() @@ -90,10 +101,9 @@ impl ClientBuilder { /// The builder will try to create the missing dependencies using default implementations /// if possible. pub fn build(self) -> MithrilResult { - let logger = match self.logger { - Some(logger) => logger, - None => Logger::root(slog::Discard, o!()), - }; + let logger = self + .logger + .unwrap_or_else(|| Logger::root(slog::Discard, o!())); let feedback_sender = FeedbackSender::new(&self.feedback_receivers); @@ -128,6 +138,11 @@ impl ClientBuilder { Some(snapshot_downloader) => snapshot_downloader, }; + #[cfg(feature = "unstable")] + let cardano_transaction_proof_client = Arc::new(CardanoTransactionProofClient::new( + aggregator_client.clone(), + )); + let certificate_verifier = match self.certificate_verifier { None => Arc::new( MithrilCertificateVerifier::new( @@ -160,6 +175,8 @@ impl ClientBuilder { )); Ok(Client { + #[cfg(feature = "unstable")] + cardano_transaction_proof_client, certificate_client, mithril_stake_distribution_client, snapshot_client, diff --git a/mithril-client/src/feedback.rs b/mithril-client/src/feedback.rs index a61ac8dd23b..e540ea86398 100644 --- a/mithril-client/src/feedback.rs +++ b/mithril-client/src/feedback.rs @@ -52,12 +52,16 @@ //! ``` use async_trait::async_trait; +use serde::Serialize; use slog::{info, Logger}; use std::sync::{Arc, RwLock}; +use strum::Display; use uuid::Uuid; /// Event that can be reported by a [FeedbackReceiver]. -#[derive(Debug, Clone, Eq, PartialEq)] +#[derive(Debug, Clone, Eq, PartialEq, Display, Serialize)] +#[strum(serialize_all = "PascalCase")] +#[serde(untagged)] pub enum MithrilEvent { /// A snapshot download has started SnapshotDownloadStarted { @@ -157,8 +161,8 @@ impl FeedbackSender { } /// A receiver of [MithrilEvent]. -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] pub trait FeedbackReceiver: Sync + Send { /// Callback called by a [FeedbackSender] when it needs to send an [event][MithrilEvent]. async fn handle_event(&self, event: MithrilEvent); @@ -176,8 +180,8 @@ impl SlogFeedbackReceiver { } } -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] impl FeedbackReceiver for SlogFeedbackReceiver { async fn handle_event(&self, event: MithrilEvent) { match event { @@ -273,8 +277,8 @@ impl Default for StackFeedbackReceiver { } } -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] impl FeedbackReceiver for StackFeedbackReceiver { async fn handle_event(&self, event: MithrilEvent) { let mut events = self.stacked_events.write().unwrap(); diff --git a/mithril-client/src/lib.rs b/mithril-client/src/lib.rs index 2579e15db51..d6bf4d59153 100644 --- a/mithril-client/src/lib.rs +++ b/mithril-client/src/lib.rs @@ -6,8 +6,10 @@ //! //! It handles the different types that can be queried to a Mithril aggregator: //! -//! - [Snapshot][snapshot_client] list, get and download tarball. +//! - [Snapshot][snapshot_client] list, get, download tarball and record statistics. //! - [Mithril stake distribution][mithril_stake_distribution_client] list and get. +//! - [Cardano transactions proofs][cardano_transaction_proof_client] list & get commitment, get proofs +//! _(available using crate feature_ **unstable**_)_. //! - [Certificates][certificate_client] list, get, and chain validation. //! //! The [Client] aggregates the queries of all of those types. @@ -23,6 +25,7 @@ //! **Note:** _Snapshot download and the compute snapshot message functions are available using crate feature_ **fs**. //! //! ```no_run +//! # #[cfg(feature = "fs")] //! # async fn run() -> mithril_client::MithrilResult<()> { //! use mithril_client::{ClientBuilder, MessageBuilder}; //! use std::path::Path; @@ -46,6 +49,10 @@ //! .download_unpack(&snapshot, &target_directory) //! .await?; //! +//! if let Err(e) = client.snapshot().add_statistics(&snapshot).await { +//! println!("Could not increment snapshot download statistics: {:?}", e); +//! } +//! //! let message = MessageBuilder::new() //! .compute_snapshot_message(&certificate, &target_directory) //! .await?; @@ -65,15 +72,29 @@ macro_rules! cfg_fs { } } +macro_rules! cfg_unstable { + ($($item:item)*) => { + $( + #[cfg(feature = "unstable")] + #[cfg_attr(docsrs, doc(cfg(feature = "unstable")))] + $item + )* + } +} + pub mod aggregator_client; +cfg_unstable! { + pub mod cardano_transaction_proof_client; +} pub mod certificate_client; mod client; pub mod feedback; mod message; pub mod mithril_stake_distribution_client; pub mod snapshot_client; -#[cfg(feature = "fs")] -pub mod snapshot_downloader; +cfg_fs! { + pub mod snapshot_downloader; +} mod type_alias; mod utils; diff --git a/mithril-client/src/message.rs b/mithril-client/src/message.rs index 4622eda5f5c..aed5e9212c5 100644 --- a/mithril-client/src/message.rs +++ b/mithril-client/src/message.rs @@ -1,8 +1,6 @@ use anyhow::Context; #[cfg(feature = "fs")] use mithril_common::digesters::{CardanoImmutableDigester, ImmutableDigester}; -use mithril_common::entities::{ProtocolMessage, ProtocolMessagePartKey}; -use mithril_common::messages::SignerWithStakeMessagePart; use mithril_common::protocol::SignerBuilder; use slog::{o, Logger}; #[cfg(feature = "fs")] @@ -10,9 +8,12 @@ use std::path::Path; #[cfg(feature = "fs")] use std::sync::Arc; -#[cfg(feature = "fs")] +use crate::common::{ProtocolMessage, ProtocolMessagePartKey}; +#[cfg(any(feature = "fs", feature = "unstable"))] use crate::MithrilCertificate; -use crate::{MithrilResult, MithrilStakeDistribution}; +#[cfg(feature = "unstable")] +use crate::VerifiedCardanoTransactions; +use crate::{MithrilResult, MithrilSigner, MithrilStakeDistribution}; /// A [MessageBuilder] can be used to compute the message of Mithril artifacts. pub struct MessageBuilder { @@ -39,49 +40,49 @@ impl MessageBuilder { } cfg_fs! { - fn get_immutable_digester(&self) -> Arc { - match self.immutable_digester.as_ref() { - None => Arc::new(CardanoImmutableDigester::new(None, self.logger.clone())), - Some(digester) => digester.clone(), + fn get_immutable_digester(&self) -> Arc { + match self.immutable_digester.as_ref() { + None => Arc::new(CardanoImmutableDigester::new(None, self.logger.clone())), + Some(digester) => digester.clone(), + } } - } - - /// Set the [ImmutableDigester] to be used for the message computation for snapshot. - /// - /// If not set a default implementation will be used. - pub fn with_immutable_digester( - mut self, - immutable_digester: Arc, - ) -> Self { - self.immutable_digester = Some(immutable_digester); - self - } - /// Compute message for a snapshot (based on the directory where it was unpacked). - /// - /// Warning: this operation can be quite long depending on the snapshot size. - pub async fn compute_snapshot_message( - &self, - snapshot_certificate: &MithrilCertificate, - unpacked_snapshot_directory: &Path, - ) -> MithrilResult { - let digester = self.get_immutable_digester(); - - let mut message = snapshot_certificate.protocol_message.clone(); + /// Set the [ImmutableDigester] to be used for the message computation for snapshot. + /// + /// If not set a default implementation will be used. + pub fn with_immutable_digester( + mut self, + immutable_digester: Arc, + ) -> Self { + self.immutable_digester = Some(immutable_digester); + self + } - let digest = digester - .compute_digest(unpacked_snapshot_directory, &snapshot_certificate.beacon) - .await - .with_context(|| { - format!( - "Snapshot digest computation failed: unpacked_dir: '{}'", - unpacked_snapshot_directory.display() - ) - })?; - message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest); + /// Compute message for a snapshot (based on the directory where it was unpacked). + /// + /// Warning: this operation can be quite long depending on the snapshot size. + pub async fn compute_snapshot_message( + &self, + snapshot_certificate: &MithrilCertificate, + unpacked_snapshot_directory: &Path, + ) -> MithrilResult { + let digester = self.get_immutable_digester(); + + let mut message = snapshot_certificate.protocol_message.clone(); + + let digest = digester + .compute_digest(unpacked_snapshot_directory, &snapshot_certificate.beacon) + .await + .with_context(|| { + format!( + "Snapshot digest computation failed: unpacked_dir: '{}'", + unpacked_snapshot_directory.display() + ) + })?; + message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest); - Ok(message) - } + Ok(message) + } } /// Compute message for a Mithril stake distribution. @@ -89,10 +90,9 @@ impl MessageBuilder { &self, mithril_stake_distribution: &MithrilStakeDistribution, ) -> MithrilResult { - let signers = SignerWithStakeMessagePart::try_into_signers( - mithril_stake_distribution.signers_with_stake.clone(), - ) - .with_context(|| "Could not compute message: conversion failure")?; + let signers = + MithrilSigner::try_into_signers(mithril_stake_distribution.signers_with_stake.clone()) + .with_context(|| "Could not compute message: conversion failure")?; let signer_builder = SignerBuilder::new(&signers, &mithril_stake_distribution.protocol_parameters) @@ -112,6 +112,19 @@ impl MessageBuilder { Ok(message) } + + cfg_unstable! { + /// Compute message for a Cardano Transactions Proofs. + pub fn compute_cardano_transactions_proofs_message( + &self, + transactions_proofs_certificate: &MithrilCertificate, + verified_transactions: &VerifiedCardanoTransactions, + ) -> ProtocolMessage { + let mut message = transactions_proofs_certificate.protocol_message.clone(); + verified_transactions.fill_protocol_message(&mut message); + message + } + } } impl Default for MessageBuilder { diff --git a/mithril-client/src/mithril_stake_distribution_client.rs b/mithril-client/src/mithril_stake_distribution_client.rs index c9ef6348426..a53e0a13d71 100644 --- a/mithril-client/src/mithril_stake_distribution_client.rs +++ b/mithril-client/src/mithril_stake_distribution_client.rs @@ -95,11 +95,11 @@ impl MithrilStakeDistributionClient { #[cfg(test)] mod tests { use chrono::{DateTime, Utc}; - use mithril_common::{ - entities::Epoch, messages::SignerWithStakeMessagePart, test_utils::fake_data, - }; + use mithril_common::test_utils::fake_data; use crate::aggregator_client::MockAggregatorHTTPClient; + use crate::common::Epoch; + use crate::MithrilSigner; use super::*; @@ -145,9 +145,7 @@ mod tests { let message = MithrilStakeDistribution { certificate_hash: "certificate-hash-123".to_string(), epoch: Epoch(1), - signers_with_stake: SignerWithStakeMessagePart::from_signers( - fake_data::signers_with_stakes(2), - ), + signers_with_stake: MithrilSigner::from_signers(fake_data::signers_with_stakes(2)), hash: "hash".to_string(), created_at: DateTime::::default(), protocol_parameters: fake_data::protocol_parameters(), diff --git a/mithril-client/src/snapshot_client.rs b/mithril-client/src/snapshot_client.rs index 93fd57315c6..d8bbb4d4180 100644 --- a/mithril-client/src/snapshot_client.rs +++ b/mithril-client/src/snapshot_client.rs @@ -45,6 +45,7 @@ //! To download and simultaneously unpack the tarball of a snapshots using the [ClientBuilder][crate::client::ClientBuilder]. //! //! ```no_run +//! # #[cfg(feature = "fs")] //! # async fn run() -> mithril_client::MithrilResult<()> { //! use mithril_client::ClientBuilder; //! use std::path::Path; @@ -62,6 +63,33 @@ //! # Ok(()) //! # } //! ``` +//! +//! # Add statistics +//! **Note:** _Available on crate feature_ **fs** _only._ +//! +//! Increments the aggregator snapshot download statistics using the [ClientBuilder][crate::client::ClientBuilder]. +//! +//! ```no_run +//! # #[cfg(feature = "fs")] +//! # async fn run() -> mithril_client::MithrilResult<()> { +//! use mithril_client::ClientBuilder; +//! use std::path::Path; +//! +//! let client = ClientBuilder::aggregator("YOUR_AGGREGATOR_ENDPOINT", "YOUR_GENESIS_VERIFICATION_KEY").build()?; +//! let snapshot = client.snapshot().get("SNAPSHOT_DIGEST").await?.unwrap(); +//! +//! // Note: the directory must already exist, and the user running the binary must have read/write access to it. +//! let target_directory = Path::new("/home/user/download/"); +//! client +//! .snapshot() +//! .download_unpack(&snapshot, target_directory) +//! .await?; +//! +//! client.snapshot().add_statistics(&snapshot).await.unwrap(); +//! # +//! # Ok(()) +//! # } +//! ``` use anyhow::Context; #[cfg(feature = "fs")] @@ -154,65 +182,75 @@ impl SnapshotClient { } cfg_fs! { - /// Download and unpack the given snapshot to the given directory - /// - /// **NOTE**: The directory should already exist, and the user running the binary - /// must have read/write access to it. - pub async fn download_unpack( - &self, - snapshot: &Snapshot, - target_dir: &std::path::Path, - ) -> MithrilResult<()> { - use crate::feedback::MithrilEvent; + /// Download and unpack the given snapshot to the given directory + /// + /// **NOTE**: The directory should already exist, and the user running the binary + /// must have read/write access to it. + pub async fn download_unpack( + &self, + snapshot: &Snapshot, + target_dir: &std::path::Path, + ) -> MithrilResult<()> { + use crate::feedback::MithrilEvent; - for location in snapshot.locations.as_slice() { - if self.snapshot_downloader.probe(location).await.is_ok() { - let download_id = MithrilEvent::new_snapshot_download_id(); - self.feedback_sender - .send_event(MithrilEvent::SnapshotDownloadStarted { - digest: snapshot.digest.clone(), - download_id: download_id.clone(), - size: snapshot.size, - }) - .await; - return match self - .snapshot_downloader - .download_unpack( - location, - target_dir, - snapshot.compression_algorithm.unwrap_or_default(), - &download_id, - snapshot.size, - ) - .await - { - Ok(()) => { - // todo: add snapshot statistics to cli (it was previously done here) - // note: the snapshot download does not fail if the statistic call fails. - self.feedback_sender - .send_event(MithrilEvent::SnapshotDownloadCompleted { download_id }) - .await; - Ok(()) - } - Err(e) => { - slog::warn!( - self.logger, - "Failed downloading snapshot from '{location}' Error: {e}." - ); - Err(e) - } - }; + for location in snapshot.locations.as_slice() { + if self.snapshot_downloader.probe(location).await.is_ok() { + let download_id = MithrilEvent::new_snapshot_download_id(); + self.feedback_sender + .send_event(MithrilEvent::SnapshotDownloadStarted { + digest: snapshot.digest.clone(), + download_id: download_id.clone(), + size: snapshot.size, + }) + .await; + return match self + .snapshot_downloader + .download_unpack( + location, + target_dir, + snapshot.compression_algorithm.unwrap_or_default(), + &download_id, + snapshot.size, + ) + .await + { + Ok(()) => { + self.feedback_sender + .send_event(MithrilEvent::SnapshotDownloadCompleted { download_id }) + .await; + Ok(()) + } + Err(e) => { + slog::warn!( + self.logger, + "Failed downloading snapshot from '{location}' Error: {e}." + ); + Err(e) + } + }; + } } - } - let locations = snapshot.locations.join(", "); + let locations = snapshot.locations.join(", "); - Err(SnapshotClientError::NoWorkingLocation { - digest: snapshot.digest.clone(), - locations, + Err(SnapshotClientError::NoWorkingLocation { + digest: snapshot.digest.clone(), + locations, + } + .into()) } - .into()) } + + /// Increments the aggregator snapshot download statistics + pub async fn add_statistics(&self, snapshot: &Snapshot) -> MithrilResult<()> { + let _response = self + .aggregator_client + .post_content(AggregatorRequest::IncrementSnapshotStatistic { + snapshot: serde_json::to_string(snapshot)?, + }) + .await?; + + Ok(()) } } diff --git a/mithril-client/src/type_alias.rs b/mithril-client/src/type_alias.rs index 457153e06c2..396fe16609a 100644 --- a/mithril-client/src/type_alias.rs +++ b/mithril-client/src/type_alias.rs @@ -36,10 +36,29 @@ pub use mithril_common::messages::CertificateListItemMessageMetadata as MithrilC /// pub use mithril_common::messages::SignerWithStakeMessagePart as MithrilSigner; +cfg_unstable! { + pub use mithril_common::messages::CardanoTransactionsProofsMessage as CardanoTransactionsProofs; + + pub use mithril_common::messages::CardanoTransactionsSetProofMessagePart as CardanoTransactionsSetProof; + + pub use mithril_common::messages::VerifiedCardanoTransactions; + + /// A commitment that Mithril have certified Cardano transactions up to a given [point of time][common::Beacon]. + /// + pub use mithril_common::messages::CardanoTransactionCommitmentMessage as CardanoTransactionCommitment; + + /// List item of a Cardano transaction commitment. + /// + pub use mithril_common::messages::CardanoTransactionCommitmentListItemMessage as CardanoTransactionCommitmentListItem; +} + /// `mithril-common` re-exports pub mod common { pub use mithril_common::entities::{ Beacon, CompressionAlgorithm, Epoch, ProtocolMessage, ProtocolMessagePartKey, ProtocolParameters, }; + cfg_unstable! { + pub use mithril_common::entities::TransactionHash; + } } diff --git a/mithril-client/tests/cardano_transaction_proof.rs b/mithril-client/tests/cardano_transaction_proof.rs new file mode 100644 index 00000000000..9fb2abf18ff --- /dev/null +++ b/mithril-client/tests/cardano_transaction_proof.rs @@ -0,0 +1,68 @@ +mod extensions; + +use crate::extensions::fake::{FakeAggregator, FakeCertificateVerifier}; +use mithril_client::{aggregator_client::AggregatorRequest, ClientBuilder, MessageBuilder}; + +#[tokio::test] +async fn cardano_transaction_proof_get_validate() { + let genesis_verification_key = + mithril_common::test_utils::fake_keys::genesis_verification_key()[0]; + + let transactions_hashes = ["abc", "def"]; + let certificate_hash = "certificate_hash"; + let fake_aggregator = FakeAggregator::new(); + let test_http_server = + fake_aggregator.spawn_with_transactions_proofs(&transactions_hashes, certificate_hash); + let client = ClientBuilder::aggregator(&test_http_server.url(), genesis_verification_key) + .with_certificate_verifier(FakeCertificateVerifier::build_that_validate_any_certificate()) + .build() + .expect("Should be able to create a Client"); + let cardano_transaction_proof_client = client.cardano_transaction_proof(); + + // 1 - get list of set proofs for wanted tx & associated certificate hash + let proofs = cardano_transaction_proof_client + .get_proofs(&transactions_hashes) + .await + .expect("Getting proof for the transactions should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::GetTransactionsProofs { + transactions_hashes: transactions_hashes.iter().map(|h| h.to_string()).collect(), + } + .route() + )) + ); + + // 2 - verify the proofs + let verified_transactions = proofs.verify().expect("Proofs should be valid"); + + // 3 - validate certificate chain + let certificate = client + .certificate() + .verify_chain(&proofs.certificate_hash) + .await + .expect("Validating the chain should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::GetCertificate { + hash: proofs.certificate_hash.clone() + } + .route() + )) + ); + + // 4 - validate that the verified transactions proof is signed by the certificate + let message = MessageBuilder::new() + .compute_cardano_transactions_proofs_message(&certificate, &verified_transactions); + + assert!( + certificate.match_message(&message), + "Certificate and message did not match:\ncertificate_message: '{}'\n computed_message: '{}'", + certificate.signed_message, + message.compute_hash() + ); +} diff --git a/mithril-client/tests/certificate_get_list.rs b/mithril-client/tests/certificate_get_list.rs index a0e6ae17bf8..4ac66a21fdd 100644 --- a/mithril-client/tests/certificate_get_list.rs +++ b/mithril-client/tests/certificate_get_list.rs @@ -1,15 +1,16 @@ mod extensions; use crate::extensions::fake::FakeAggregator; -use mithril_client::ClientBuilder; +use mithril_client::{aggregator_client::AggregatorRequest, ClientBuilder}; #[tokio::test] async fn certificate_get_list() { let certificate_hash_list = vec!["certificate-123".to_string(), "certificate-456".to_string()]; let genesis_verification_key = mithril_common::test_utils::fake_keys::genesis_verification_key()[0]; - let fake_aggregator = FakeAggregator::spawn_with_certificate(&certificate_hash_list); - let client = ClientBuilder::aggregator(&fake_aggregator.url(), genesis_verification_key) + let fake_aggregator = FakeAggregator::new(); + let test_http_server = fake_aggregator.spawn_with_certificate(&certificate_hash_list); + let client = ClientBuilder::aggregator(&test_http_server.url(), genesis_verification_key) .build() .expect("Should be able to create a Client"); @@ -18,6 +19,10 @@ async fn certificate_get_list() { .list() .await .expect("List Certificate should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!("/{}", AggregatorRequest::ListCertificates.route())) + ); let mut hashes: Vec = certificates.into_iter().map(|c| c.hash).collect(); hashes.sort(); diff --git a/mithril-client/tests/extensions/fake.rs b/mithril-client/tests/extensions/fake.rs index b9d59df426e..63890c04b26 100644 --- a/mithril-client/tests/extensions/fake.rs +++ b/mithril-client/tests/extensions/fake.rs @@ -1,14 +1,18 @@ +use super::routes; +use crate::extensions::mock; use mithril_client::certificate_client::CertificateVerifier; use mithril_client::{ - MessageBuilder, MithrilCertificateListItem, MithrilStakeDistribution, + MessageBuilder, MithrilCertificate, MithrilCertificateListItem, MithrilStakeDistribution, MithrilStakeDistributionListItem, }; -use mithril_common::messages::CertificateMessage; use mithril_common::test_utils::test_http_server::{test_http_server, TestHttpServer}; +use std::convert::Infallible; use std::sync::Arc; +use tokio::sync::Mutex; +use warp::filters::path::FullPath; use warp::Filter; -use crate::extensions::mock; +pub type FakeAggregatorCalls = Arc>>; pub struct FakeCertificateVerifier; @@ -21,10 +25,52 @@ impl FakeCertificateVerifier { } } -pub struct FakeAggregator; +pub struct FakeAggregator { + calls: FakeAggregatorCalls, +} impl FakeAggregator { + pub fn new() -> Self { + FakeAggregator { + calls: Arc::new(Mutex::new(vec![])), + } + } + + async fn get_calls(&self) -> Vec { + let calls = self.calls.lock().await; + + calls.clone() + } + + pub async fn get_last_call(&self) -> Option { + self.get_calls().await.last().cloned() + } + + pub async fn store_call_and_return_value( + full_path: FullPath, + calls: FakeAggregatorCalls, + returned_value: String, + ) -> Result { + let mut call_list = calls.lock().await; + call_list.push(full_path.as_str().to_string()); + + Ok(returned_value) + } + + pub async fn store_call_with_query_and_return_value( + full_path: FullPath, + query: String, + calls: FakeAggregatorCalls, + returned_value: String, + ) -> Result { + let mut call_list = calls.lock().await; + call_list.push(format!("{}?{}", full_path.as_str(), query)); + + Ok(returned_value) + } + pub fn spawn_with_mithril_stake_distribution( + &self, msd_hash: &str, certificate_hash: &str, ) -> TestHttpServer { @@ -49,28 +95,31 @@ impl FakeAggregator { .compute_mithril_stake_distribution_message(&mithril_stake_distribution) .expect("Computing msd message should not fail"); - let certificate_json = serde_json::to_string(&CertificateMessage { + let certificate_json = serde_json::to_string(&MithrilCertificate { hash: certificate_hash.to_string(), signed_message: message.compute_hash(), - ..CertificateMessage::dummy() + ..MithrilCertificate::dummy() }) .unwrap(); test_http_server( - warp::path!("artifact" / "mithril-stake-distributions") - .map(move || mithril_stake_distribution_list_json.clone()) - .or( - warp::path!("artifact" / "mithril-stake-distribution" / String) - .map(move |_hash| mithril_stake_distribution_json.clone()), - ) - .or(warp::path!("certificate" / String).map(move |_hash| certificate_json.clone())), + routes::mithril_stake_distribution::routes( + self.calls.clone(), + mithril_stake_distribution_list_json, + mithril_stake_distribution_json, + ) + .or(routes::certificate::routes( + self.calls.clone(), + None, + certificate_json, + )), ) } - pub fn spawn_with_certificate(certificate_hash_list: &[String]) -> TestHttpServer { - let certificate_json = serde_json::to_string(&CertificateMessage { + pub fn spawn_with_certificate(&self, certificate_hash_list: &[String]) -> TestHttpServer { + let certificate_json = serde_json::to_string(&MithrilCertificate { hash: certificate_hash_list[0].to_string(), - ..CertificateMessage::dummy() + ..MithrilCertificate::dummy() }) .unwrap(); let certificate_list_json = serde_json::to_string( @@ -84,11 +133,57 @@ impl FakeAggregator { ) .unwrap(); - test_http_server( - warp::path!("certificates") - .map(move || certificate_list_json.clone()) - .or(warp::path!("certificate" / String).map(move |_hash| certificate_json.clone())), - ) + test_http_server(routes::certificate::routes( + self.calls.clone(), + Some(certificate_list_json), + certificate_json, + )) + } +} + +#[cfg(feature = "unstable")] +mod proof { + use super::*; + use mithril_client::common::ProtocolMessagePartKey; + use mithril_client::{CardanoTransactionsProofs, CardanoTransactionsSetProof}; + use mithril_common::crypto_helper::{MKProof, ProtocolMkProof}; + + impl FakeAggregator { + pub fn spawn_with_transactions_proofs( + &self, + tx_hashes: &[&str], + certificate_hash: &str, + ) -> TestHttpServer { + let proof = MKProof::from_leaves(tx_hashes).unwrap(); + + let proofs_json = serde_json::to_string(&CardanoTransactionsProofs { + certificate_hash: certificate_hash.to_string(), + certified_transactions: vec![CardanoTransactionsSetProof { + transactions_hashes: tx_hashes.iter().map(|h| h.to_string()).collect(), + proof: ProtocolMkProof::new(proof.clone()).to_json_hex().unwrap(), + }], + non_certified_transactions: vec![], + }) + .unwrap(); + + let certificate = { + let mut cert = MithrilCertificate { + hash: certificate_hash.to_string(), + ..MithrilCertificate::dummy() + }; + cert.protocol_message.set_message_part( + ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, + proof.root().to_hex(), + ); + cert.signed_message = cert.protocol_message.compute_hash(); + cert + }; + let certificate_json = serde_json::to_string(&certificate).unwrap(); + + test_http_server(routes::proof::routes(self.calls.clone(), proofs_json).or( + routes::certificate::routes(self.calls.clone(), None, certificate_json), + )) + } } } @@ -98,7 +193,6 @@ mod file { use mithril_client::{MessageBuilder, Snapshot, SnapshotListItem}; use mithril_common::digesters::DummyImmutableDb; use mithril_common::entities::{Beacon, CompressionAlgorithm}; - use mithril_common::messages::CertificateMessage; use mithril_common::test_utils::fake_data; use mithril_common::test_utils::test_http_server::{test_http_server, TestHttpServer}; use std::path::{Path, PathBuf}; @@ -108,6 +202,7 @@ mod file { impl FakeAggregator { #[cfg(feature = "fs")] pub async fn spawn_with_snapshot( + &self, snapshot_digest: &str, certificate_hash: &str, immutable_db: &DummyImmutableDb, @@ -143,10 +238,10 @@ mod file { ]) .unwrap(); - let mut certificate = CertificateMessage { + let mut certificate = MithrilCertificate { hash: certificate_hash.to_string(), beacon, - ..CertificateMessage::dummy() + ..MithrilCertificate::dummy() }; certificate.signed_message = MessageBuilder::new() .compute_snapshot_message(&certificate, &immutable_db.dir) @@ -155,31 +250,21 @@ mod file { .compute_hash(); let certificate_json = serde_json::to_string(&certificate).unwrap(); - let routes = warp::path!("artifact" / "snapshots") - .map(move || snapshot_list_json.clone()) - .or( - warp::path!("artifact" / "snapshot" / String).map(move |_digest| { - let data = snapshot_clone.read().unwrap(); - serde_json::to_string(&data.clone()).unwrap() - }), - ) - .or(warp::path!("certificate" / String).map(move |_hash| certificate_json.clone())); + let routes = + routes::snapshot::routes(self.calls.clone(), snapshot_list_json, snapshot_clone) + .or(routes::certificate::routes( + self.calls.clone(), + None, + certificate_json, + )) + .or(routes::statistics::routes(self.calls.clone())); let snapshot_archive_path = build_fake_zstd_snapshot(immutable_db, work_dir); - let routes = routes.or(warp::path!("artifact" / "snapshot" / String / "download") - .and(warp::fs::file(snapshot_archive_path)) - .map(|_digest, reply: warp::fs::File| { - let filepath = reply.path().to_path_buf(); - Box::new(warp::reply::with_header( - reply, - "Content-Disposition", - format!( - "attachment; filename=\"{}\"", - filepath.file_name().unwrap().to_str().unwrap() - ), - )) as Box - })); + let routes = routes.or(routes::snapshot::download( + self.calls.clone(), + snapshot_archive_path, + )); let server = test_http_server(routes); update_snapshot_location(&server.url(), snapshot_digest, snapshot); diff --git a/mithril-client/tests/extensions/mod.rs b/mithril-client/tests/extensions/mod.rs index 573b031ce9f..168344ab2b3 100644 --- a/mithril-client/tests/extensions/mod.rs +++ b/mithril-client/tests/extensions/mod.rs @@ -4,6 +4,7 @@ pub mod fake; pub mod mock; +mod routes; use std::path::PathBuf; diff --git a/mithril-client/tests/extensions/routes/certificate.rs b/mithril-client/tests/extensions/routes/certificate.rs new file mode 100644 index 00000000000..0eba6216eb6 --- /dev/null +++ b/mithril-client/tests/extensions/routes/certificate.rs @@ -0,0 +1,44 @@ +use super::middleware::with_calls_middleware; +use crate::extensions::fake::{FakeAggregator, FakeAggregatorCalls}; +use warp::Filter; + +pub fn routes( + calls: FakeAggregatorCalls, + certificate_certificates_returned_value: Option, + certificate_certificate_hash_returned_value: String, +) -> impl Filter + Clone { + certificate_certificates( + calls.clone(), + certificate_certificates_returned_value.unwrap_or_default(), + ) + .or(certificate_certificate_hash( + calls, + certificate_certificate_hash_returned_value, + )) +} + +/// Route: /certificates +fn certificate_certificates( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + warp::path!("certificates") + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |fullpath, calls| { + FakeAggregator::store_call_and_return_value(fullpath, calls, returned_value.clone()) + }) +} + +/// Route: /certificate/{certificate_hash} +fn certificate_certificate_hash( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + warp::path!("certificate" / String) + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |_param, fullpath, calls| { + FakeAggregator::store_call_and_return_value(fullpath, calls, returned_value.clone()) + }) +} diff --git a/mithril-client/tests/extensions/routes/mithril_stake_distribution.rs b/mithril-client/tests/extensions/routes/mithril_stake_distribution.rs new file mode 100644 index 00000000000..3392d5bc95a --- /dev/null +++ b/mithril-client/tests/extensions/routes/mithril_stake_distribution.rs @@ -0,0 +1,39 @@ +use super::middleware::with_calls_middleware; +use crate::extensions::fake::{FakeAggregator, FakeAggregatorCalls}; +use warp::Filter; + +pub fn routes( + calls: FakeAggregatorCalls, + stake_distributions_returned_value: String, + stake_distribution_by_id_returned_value: String, +) -> impl Filter + Clone { + mithril_stake_distributions(calls.clone(), stake_distributions_returned_value).or( + mithril_stake_distribution_by_id(calls, stake_distribution_by_id_returned_value), + ) +} + +/// Route: /artifact/mithril-stake-distributions +fn mithril_stake_distributions( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + warp::path!("artifact" / "mithril-stake-distributions") + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |fullpath, calls| { + FakeAggregator::store_call_and_return_value(fullpath, calls, returned_value.clone()) + }) +} + +/// Route: /artifact/mithril-stake-distribution/:id +fn mithril_stake_distribution_by_id( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + warp::path!("artifact" / "mithril-stake-distribution" / String) + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |_param, fullpath, calls| { + FakeAggregator::store_call_and_return_value(fullpath, calls, returned_value.clone()) + }) +} diff --git a/mithril-client/tests/extensions/routes/mod.rs b/mithril-client/tests/extensions/routes/mod.rs new file mode 100644 index 00000000000..c96953bf1a5 --- /dev/null +++ b/mithril-client/tests/extensions/routes/mod.rs @@ -0,0 +1,17 @@ +pub mod certificate; +pub mod mithril_stake_distribution; +pub mod proof; +pub mod snapshot; +pub mod statistics; + +mod middleware { + use crate::extensions::fake::FakeAggregatorCalls; + use std::convert::Infallible; + use warp::Filter; + + pub fn with_calls_middleware( + calls: FakeAggregatorCalls, + ) -> impl Filter + Clone { + warp::any().map(move || calls.clone()) + } +} diff --git a/mithril-client/tests/extensions/routes/proof.rs b/mithril-client/tests/extensions/routes/proof.rs new file mode 100644 index 00000000000..932603c9fb1 --- /dev/null +++ b/mithril-client/tests/extensions/routes/proof.rs @@ -0,0 +1,30 @@ +use crate::extensions::fake::{FakeAggregator, FakeAggregatorCalls}; +use crate::extensions::routes::middleware::with_calls_middleware; +use warp::Filter; + +pub fn routes( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + proof_cardano_transaction(calls.clone(), returned_value) +} + +/// Route: /proof/cardano-transaction +fn proof_cardano_transaction( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + warp::path!("proof" / "cardano-transaction") + .and(warp::get()) + .and(warp::path::full().map(move |p| p)) + .and(warp::query::raw()) + .and(with_calls_middleware(calls.clone())) + .and_then(move |fullpath, query, calls| { + FakeAggregator::store_call_with_query_and_return_value( + fullpath, + query, + calls, + returned_value.clone(), + ) + }) +} diff --git a/mithril-client/tests/extensions/routes/snapshot.rs b/mithril-client/tests/extensions/routes/snapshot.rs new file mode 100644 index 00000000000..a2d1db7b1cd --- /dev/null +++ b/mithril-client/tests/extensions/routes/snapshot.rs @@ -0,0 +1,81 @@ +use super::middleware::with_calls_middleware; +use crate::extensions::fake::{FakeAggregator, FakeAggregatorCalls}; +use mithril_client::Snapshot; +use std::{ + convert::Infallible, + path::PathBuf, + sync::{Arc, RwLock}, +}; +use warp::{filters::path::FullPath, Filter}; + +pub fn routes( + calls: FakeAggregatorCalls, + snapshots_returned_value: String, + snapshot_by_id_returned_value: Arc>, +) -> impl Filter + Clone { + snapshots(calls.clone(), snapshots_returned_value) + .or(snapshot_by_id(calls.clone(), snapshot_by_id_returned_value)) +} + +/// Route: /artifact/snapshots +fn snapshots( + calls: FakeAggregatorCalls, + returned_value: String, +) -> impl Filter + Clone { + warp::path!("artifact" / "snapshots") + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |fullpath, calls| { + FakeAggregator::store_call_and_return_value(fullpath, calls, returned_value.clone()) + }) +} + +/// Route: /artifact/snapshot/:id +fn snapshot_by_id( + calls: FakeAggregatorCalls, + returned_value: Arc>, +) -> impl Filter + Clone { + warp::path!("artifact" / "snapshot" / String) + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |_param, fullpath, calls| { + let data = returned_value.read().unwrap(); + FakeAggregator::store_call_and_return_value( + fullpath, + calls, + serde_json::to_string(&data.clone()).unwrap(), + ) + }) +} + +/// Route: /artifact/snapshots/{digest}/download +pub fn download( + calls: FakeAggregatorCalls, + archive_path: PathBuf, +) -> impl Filter + Clone { + warp::path!("artifact" / "snapshot" / String / "download") + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and(warp::fs::file(archive_path)) + .and_then(store_call_and_download_return) +} + +async fn store_call_and_download_return( + _digest: String, + full_path: FullPath, + calls: FakeAggregatorCalls, + reply: warp::fs::File, +) -> Result { + let mut call_list = calls.lock().await; + call_list.push(full_path.as_str().to_string()); + + let filepath = reply.path().to_path_buf(); + Ok(Box::new(warp::reply::with_header( + reply, + "Content-Disposition", + format!( + "attachment; filename=\"{}\"", + filepath.file_name().unwrap().to_str().unwrap() + ), + )) as Box) +} diff --git a/mithril-client/tests/extensions/routes/statistics.rs b/mithril-client/tests/extensions/routes/statistics.rs new file mode 100644 index 00000000000..739df4ef447 --- /dev/null +++ b/mithril-client/tests/extensions/routes/statistics.rs @@ -0,0 +1,21 @@ +use super::middleware::with_calls_middleware; +use crate::extensions::fake::{FakeAggregator, FakeAggregatorCalls}; +use warp::Filter; + +pub fn routes( + calls: FakeAggregatorCalls, +) -> impl Filter + Clone { + add_statistics(calls.clone()) +} + +/// Route: /statistics/snapshot +fn add_statistics( + calls: FakeAggregatorCalls, +) -> impl Filter + Clone { + warp::path!("statistics" / "snapshot") + .and(warp::path::full().map(move |p| p)) + .and(with_calls_middleware(calls.clone())) + .and_then(move |fullpath, calls| { + FakeAggregator::store_call_and_return_value(fullpath, calls, "".to_string()) + }) +} diff --git a/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs b/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs index dd89ed2afca..52746425aba 100644 --- a/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs +++ b/mithril-client/tests/mithril_stake_distribution_list_get_show_verify.rs @@ -1,7 +1,7 @@ mod extensions; use crate::extensions::fake::{FakeAggregator, FakeCertificateVerifier}; -use mithril_client::{ClientBuilder, MessageBuilder}; +use mithril_client::{aggregator_client::AggregatorRequest, ClientBuilder, MessageBuilder}; #[tokio::test] async fn mithril_stake_distribution_list_get_show_verify() { @@ -9,9 +9,10 @@ async fn mithril_stake_distribution_list_get_show_verify() { mithril_common::test_utils::fake_keys::genesis_verification_key()[0]; let msd_hash = "msd_hash"; let certificate_hash = "certificate_hash"; - let fake_aggregator = - FakeAggregator::spawn_with_mithril_stake_distribution(msd_hash, certificate_hash); - let client = ClientBuilder::aggregator(&fake_aggregator.url(), genesis_verification_key) + let fake_aggregator = FakeAggregator::new(); + let test_http_server = + fake_aggregator.spawn_with_mithril_stake_distribution(msd_hash, certificate_hash); + let client = ClientBuilder::aggregator(&test_http_server.url(), genesis_verification_key) .with_certificate_verifier(FakeCertificateVerifier::build_that_validate_any_certificate()) .build() .expect("Should be able to create a Client"); @@ -21,6 +22,13 @@ async fn mithril_stake_distribution_list_get_show_verify() { .list() .await .expect("List MithrilStakeDistribution should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::ListMithrilStakeDistributions.route() + )) + ); let last_hash = mithril_stake_distributions.first().unwrap().hash.as_ref(); @@ -31,12 +39,32 @@ async fn mithril_stake_distribution_list_get_show_verify() { .unwrap_or_else(|| { panic!("A MithrilStakeDistribution should exist for hash '{last_hash}'") }); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::GetMithrilStakeDistribution { + hash: (last_hash).to_string() + } + .route() + )) + ); let certificate = client .certificate() .verify_chain(&mithril_stake_distribution.certificate_hash) .await .expect("Validating the chain should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::GetCertificate { + hash: mithril_stake_distribution.certificate_hash.clone() + } + .route() + )) + ); let message = MessageBuilder::new() .compute_mithril_stake_distribution_message(&mithril_stake_distribution) diff --git a/mithril-client/tests/snapshot_list_get_show_download_verify.rs b/mithril-client/tests/snapshot_list_get_show_download_verify.rs index 3b7b6c5d54f..6adfe1477f8 100644 --- a/mithril-client/tests/snapshot_list_get_show_download_verify.rs +++ b/mithril-client/tests/snapshot_list_get_show_download_verify.rs @@ -1,6 +1,7 @@ mod extensions; use crate::extensions::fake::{FakeAggregator, FakeCertificateVerifier}; +use mithril_client::aggregator_client::AggregatorRequest; use mithril_client::feedback::SlogFeedbackReceiver; use mithril_client::{ClientBuilder, MessageBuilder}; use mithril_common::digesters::DummyImmutablesDbBuilder; @@ -17,10 +18,11 @@ async fn snapshot_list_get_show_download_verify() { .with_immutables(&[1, 2, 3]) .append_immutable_trio() .build(); - let fake_aggregator = - FakeAggregator::spawn_with_snapshot(digest, certificate_hash, &immutable_db, &work_dir) - .await; - let client = ClientBuilder::aggregator(&fake_aggregator.url(), genesis_verification_key) + let fake_aggregator = FakeAggregator::new(); + let test_http_server = fake_aggregator + .spawn_with_snapshot(digest, certificate_hash, &immutable_db, &work_dir) + .await; + let client = ClientBuilder::aggregator(&test_http_server.url(), genesis_verification_key) .with_certificate_verifier(FakeCertificateVerifier::build_that_validate_any_certificate()) .add_feedback_receiver(Arc::new(SlogFeedbackReceiver::new( extensions::test_logger(), @@ -33,6 +35,10 @@ async fn snapshot_list_get_show_download_verify() { .list() .await .expect("List MithrilStakeDistribution should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!("/{}", AggregatorRequest::ListSnapshots.route())) + ); let last_digest = snapshots.first().unwrap().digest.as_ref(); @@ -42,6 +48,16 @@ async fn snapshot_list_get_show_download_verify() { .await .expect("Get Snapshot should not fail ") .unwrap_or_else(|| panic!("A Snapshot should exist for hash '{last_digest}'")); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::GetSnapshot { + digest: (last_digest.to_string()) + } + .route() + )) + ); let unpacked_dir = work_dir.join("unpack"); std::fs::create_dir(&unpacked_dir).unwrap(); @@ -51,12 +67,48 @@ async fn snapshot_list_get_show_download_verify() { .verify_chain(&snapshot.certificate_hash) .await .expect("Validating the chain should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::GetCertificate { + hash: (snapshot.certificate_hash.clone()) + } + .route() + )) + ); client .snapshot() .download_unpack(&snapshot, &unpacked_dir) .await .expect("download/unpack snapshot should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}/download", + AggregatorRequest::GetSnapshot { + digest: (snapshot.digest.clone()) + } + .route() + )) + ); + + client + .snapshot() + .add_statistics(&snapshot) + .await + .expect("add_statistics should not fail"); + assert_eq!( + fake_aggregator.get_last_call().await, + Some(format!( + "/{}", + AggregatorRequest::IncrementSnapshotStatistic { + snapshot: "whatever".to_string() + } + .route() + )) + ); let message = MessageBuilder::new() .compute_snapshot_message(&certificate, &unpacked_dir) diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index d956bd0fd21..16e51f3fbb4 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.2.144" +version = "0.3.1" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } @@ -17,41 +17,45 @@ name = "digester" harness = false [dependencies] -anyhow = "1.0.75" -async-trait = "0.1.73" +anyhow = "1.0.79" +async-trait = "0.1.77" bech32 = "0.9.1" blake2 = "0.10.6" -chrono = { version = "0.4.31", features = ["serde"] } +chrono = { version = "0.4.33", features = ["serde"] } +ckb-merkle-mountain-range = "0.6.0" digest = "0.10.7" -ed25519-dalek = { version = "2.0.0", features = ["rand_core", "serde"] } +ed25519-dalek = { version = "2.1.0", features = ["rand_core", "serde"] } fixed = "1.24.0" glob = { version = "0.3.1", optional = true } hex = "0.4.3" -http = { version = "0.2.9", optional = true } jsonschema = { version = "0.17.1", optional = true } kes-summed-ed25519 = { version = "0.2.1", features = [ "serde_enabled", "sk_clone_enabled", ] } +minicbor = { version = "0.20", features = ["std", "half", "derive"], optional = true } nom = "7.1.3" -pallas-network = { version = "0.20.0", optional = true } +pallas-addresses = { version = "0.23.0", optional = true } +pallas-codec = { version = "0.23.0", optional = true } +pallas-network = { version = "0.23.0", optional = true } +pallas-primitives = { version = "0.23.0", optional = true } +pallas-traverse = { version = "0.23.0", optional = true } rand_chacha = "0.3.1" rand_core = "0.6.4" -rayon = "1.8.0" -semver = "1.0.19" -serde = { version = "1.0.188", features = ["derive"] } -serde_bytes = "0.11.12" +rayon = "1.8.1" +semver = "1.0.21" +serde = { version = "1.0.196", features = ["derive"] } +serde_bytes = "0.11.14" serde_cbor = "0.11.2" -serde_json = "1.0.107" -serde_with = "3.3.0" -serde_yaml = "0.9.25" +serde_json = "1.0.113" +serde_with = "3.6.0" +serde_yaml = "0.9.31" sha2 = "0.10.8" slog = "2.7.0" -sqlite = { version = "0.32.0", features = ["bundled"], optional = true } -strum = { version = "0.25.0", features = ["derive"] } -thiserror = "1.0.49" -tokio = { version = "1.32.0", features = ["io-util", "rt", "sync"] } -typetag = "0.2.13" +strum = { version = "0.26.1", features = ["derive"] } +thiserror = "1.0.56" +tokio = { version = "1.35.1", features = ["io-util", "rt", "sync"] } +typetag = "0.2.15" walkdir = "2.4.0" warp = { version = "0.3.6", optional = true } @@ -73,28 +77,37 @@ mithril-stm = { path = "../mithril-stm", version = "0.3", default-features = fal [dev-dependencies] criterion = { version = "0.5.1", features = ["html_reports", "async_tokio"] } -mockall = "0.11.4" -pallas-codec = "0.20.0" -reqwest = { version = "0.11.22", features = ["json"] } +mockall = "0.12.1" +pallas-crypto = "0.23.0" +rand_core = { version = "0.6.4", features = ["getrandom"] } +reqwest = { version = "0.11.23", features = ["json"] } slog-async = "2.8.0" slog-scope = "4.4.0" slog-term = "2.9.0" -tokio = { version = "1.32.0", features = ["macros", "time"] } +tokio = { version = "1.35.1", features = ["macros", "time"] } [build-dependencies] glob = "0.3.1" -semver = "1.0.19" -serde_json = "1.0.107" -serde_yaml = "0.9.25" +semver = "1.0.21" +serde_json = "1.0.113" +serde_yaml = "0.9.31" [features] default = [] # Full feature set -full = ["random", "database", "fs", "test_tools"] +full = ["random", "fs", "test_tools"] random = ["rand_core/getrandom"] -database = ["sqlite"] -fs = ["tokio/fs", "tokio/process", "pallas-network"] +fs = [ + "tokio/fs", + "tokio/process", + "dep:minicbor", + "dep:pallas-addresses", + "dep:pallas-codec", + "dep:pallas-network", + "dep:pallas-primitives", + "dep:pallas-traverse", +] # Portable feature avoids SIGILL crashes on CPUs not supporting Intel ADX instruction set when built on CPUs that support it portable = ["mithril-stm/portable"] @@ -102,10 +115,10 @@ portable = ["mithril-stm/portable"] # Disable signer certification, to be used only for tests allow_skip_signer_certification = [] # Enable all tests tools -test_tools = ["apispec", "test_http_server"] +test_tools = ["apispec", "test_http_server", "random"] # Enable tools to helps validate conformity to an OpenAPI specification -apispec = ["glob", "http", "jsonschema", "warp"] -test_http_server = ["warp"] +apispec = ["dep:glob", "dep:jsonschema", "dep:warp"] +test_http_server = ["dep:warp"] [package.metadata.docs.rs] all-features = true diff --git a/mithril-common/Makefile b/mithril-common/Makefile index 275775be046..2e44dcfb465 100644 --- a/mithril-common/Makefile +++ b/mithril-common/Makefile @@ -1,6 +1,11 @@ -.PHONY: all build test check debug run help doc +.PHONY: all build test check doc check-all-features-set CARGO = cargo +# All the crates features excluding the two that have little to no impact to the code +FEATURES := $(shell ${CARGO} metadata --quiet --no-deps \ + | jq -r '.packages[] | select(.name=="mithril-common") | .features \ + | del(.allow_skip_signer_certification) | del(.portable) \ + | keys | join(" ")') all: test build @@ -18,3 +23,17 @@ check: doc: ${CARGO} doc --no-deps --open --features full + +# Compute the powerset of all the given features and save it to a file +.feature-sets: + powerset() { [ $$# -eq 0 ] && echo || (shift; powerset "$$@") | while read r ; do echo "$$1 $$r"; echo "$$r"; done };\ + powerset $$(echo "$(FEATURES)") > .features-sets + +check-all-features-set: .feature-sets + # Read the file to run cargo clippy on all those features sets + cat .features-sets | while read features_set; do \ + echo "Clippy common with feature '$$features_set''"; \ + ${CARGO} clippy -p mithril-common --features "$$features_set"; \ + done + + rm .features-sets diff --git a/mithril-common/src/cardano_transaction_parser.rs b/mithril-common/src/cardano_transaction_parser.rs new file mode 100644 index 00000000000..3525a3ca0e5 --- /dev/null +++ b/mithril-common/src/cardano_transaction_parser.rs @@ -0,0 +1,265 @@ +//! The module used for parsing Cardano transactions + +use crate::{ + digesters::ImmutableFile, + entities::{Beacon, BlockNumber, CardanoTransaction, ImmutableFileNumber, TransactionHash}, + StdResult, +}; +use anyhow::Context; +use async_trait::async_trait; +use pallas_traverse::{ + probe::{block_era, Outcome}, + MultiEraBlock, +}; +use std::{cmp::min, fs, path::Path}; +use tokio::sync::RwLock; + +/// A parser that can read cardano transactions in a cardano database +/// +/// If you want to mock it using mockall: +/// ``` +/// mod test { +/// use anyhow::anyhow; +/// use async_trait::async_trait; +/// use mithril_common::cardano_transaction_parser::TransactionParser; +/// use mithril_common::entities::{Beacon, CardanoTransaction}; +/// use mithril_common::StdResult; +/// use mockall::mock; +/// use std::path::Path; +/// +/// mock! { +/// pub TransactionParserImpl { } +/// +/// #[async_trait] +/// impl TransactionParser for TransactionParserImpl { +/// async fn parse( +/// &self, +/// dirpath: &Path, +/// beacon: &Beacon, +/// ) -> StdResult>; +/// } +/// } +/// +/// #[test] +/// fn test_mock() { +/// let mut mock = MockTransactionParserImpl::new(); +/// mock.expect_parse().return_once(|_, _| { +/// Err(anyhow!("parse error")) +/// }); +/// } +/// } +/// ``` +#[async_trait] +pub trait TransactionParser: Sync + Send { + /// Parse the transactions + async fn parse(&self, dirpath: &Path, beacon: &Beacon) -> StdResult>; +} + +/// Dumb transaction parser +pub struct DumbTransactionParser { + transactions: RwLock>, +} + +impl DumbTransactionParser { + /// Factory + pub fn new(transactions: Vec) -> Self { + Self { + transactions: RwLock::new(transactions), + } + } + + /// Update transactions returned by `parse` + pub async fn update_transactions(&self, new_transactions: Vec) { + let mut transactions = self.transactions.write().await; + *transactions = new_transactions; + } +} + +#[async_trait] +impl TransactionParser for DumbTransactionParser { + async fn parse(&self, _dirpath: &Path, _beacon: &Beacon) -> StdResult> { + Ok(self.transactions.read().await.clone()) + } +} + +#[derive(Debug)] +struct Block { + pub block_number: BlockNumber, + pub immutable_file_number: ImmutableFileNumber, + pub transactions: Vec, +} + +impl Block { + fn try_convert( + multi_era_block: MultiEraBlock, + immutable_file_number: ImmutableFileNumber, + ) -> StdResult { + let mut transactions = Vec::new(); + for tx in &multi_era_block.txs() { + transactions.push(tx.hash().to_string()); + } + let block = Block { + block_number: multi_era_block.number(), + immutable_file_number, + transactions, + }; + + Ok(block) + } +} + +/// Cardano transaction parser +pub struct CardanoTransactionParser {} + +impl CardanoTransactionParser { + /// Factory + pub fn new() -> Self { + Self {} + } + + /// Read blocks from immutable file + fn read_blocks_from_immutable_file(immutable_file: &ImmutableFile) -> StdResult> { + let cbor = fs::read(&immutable_file.path).with_context(|| { + format!( + "CardanoTransactionParser could not read from immutable file: {:?}", + immutable_file.path + ) + })?; + + let mut blocks_start_byte_index: Vec<_> = (0..cbor.len()) + .filter(|&byte_index| { + let cbor_header_maybe = &cbor[byte_index..min(byte_index + 2, cbor.len())]; + match block_era(cbor_header_maybe) { + Outcome::Matched(_) | Outcome::EpochBoundary => true, + Outcome::Inconclusive => false, + } + }) + .collect(); + + blocks_start_byte_index.push(cbor.len() + 1); + + let mut blocks = Vec::new(); + let mut last_start_byte_index = 0; + for block_start_index in blocks_start_byte_index.into_iter().skip(1) { + let maybe_end_byte_index = min(block_start_index, cbor.len()); + if let Ok(multi_era_block) = + MultiEraBlock::decode(&cbor[last_start_byte_index..maybe_end_byte_index]) + { + let block = Block::try_convert(multi_era_block, immutable_file.number) + .with_context(|| { + format!( + "CardanoTransactionParser could not read data from block in immutable file: {:?}", + immutable_file.path + ) + })?; + blocks.push(block); + last_start_byte_index = block_start_index; + } + } + + Ok(blocks) + } +} + +impl Default for CardanoTransactionParser { + fn default() -> Self { + Self::new() + } +} + +#[async_trait] +impl TransactionParser for CardanoTransactionParser { + async fn parse(&self, dirpath: &Path, beacon: &Beacon) -> StdResult> { + let up_to_file_number = beacon.immutable_file_number; + let immutable_chunks = ImmutableFile::list_completed_in_dir(dirpath)? + .into_iter() + .filter(|f| f.number <= up_to_file_number && f.filename.contains("chunk")) + .collect::>(); + let mut transactions: Vec = vec![]; + + for immutable_file in &immutable_chunks { + let blocks = + Self::read_blocks_from_immutable_file(immutable_file).with_context(|| { + format!( + "CardanoTransactionParser could read blocks from immutable file: '{}'.", + immutable_file.path.display() + ) + })?; + let mut block_transactions = blocks + .into_iter() + .flat_map(|block| { + block + .transactions + .into_iter() + .map(move |transaction_hash| CardanoTransaction { + transaction_hash, + block_number: block.block_number, + immutable_file_number: block.immutable_file_number, + }) + }) + .collect::>(); + + transactions.append(&mut block_transactions); + } + + Ok(transactions) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + fn get_number_of_immutable_chunk_in_dir(dir: &Path) -> usize { + ImmutableFile::list_completed_in_dir(dir) + .unwrap() + .into_iter() + .map(|i| i.filename.contains("chunk")) + .len() + } + + #[tokio::test] + async fn test_parse_expected_number_of_transactions() { + // We known the number of transactions in those prebuilt immutables + let immutable_files = [("00000", 20usize), ("00001", 8), ("00002", 0)]; + let db_path = Path::new("../mithril-test-lab/test_data/immutable/"); + assert!(get_number_of_immutable_chunk_in_dir(db_path) >= 3); + + let beacon = Beacon { + immutable_file_number: 2, + ..Beacon::default() + }; + let tx_count: usize = immutable_files.iter().map(|(_, count)| *count).sum(); + let cardano_transaction_parser = CardanoTransactionParser::new(); + + let transactions = cardano_transaction_parser + .parse(db_path, &beacon) + .await + .unwrap(); + + assert_eq!(transactions.len(), tx_count); + } + + #[tokio::test] + async fn test_parse_up_to_given_beacon() { + // We known the number of transactions in those prebuilt immutables + let immutable_files = [("00000", 20usize)]; + let db_path = Path::new("../mithril-test-lab/test_data/immutable/"); + assert!(get_number_of_immutable_chunk_in_dir(db_path) >= 2); + + let beacon = Beacon { + immutable_file_number: 0, + ..Beacon::default() + }; + let tx_count: usize = immutable_files.iter().map(|(_, count)| *count).sum(); + let cardano_transaction_parser = CardanoTransactionParser::new(); + + let transactions = cardano_transaction_parser + .parse(db_path, &beacon) + .await + .unwrap(); + + assert_eq!(transactions.len(), tx_count); + } +} diff --git a/mithril-common/src/certificate_chain/certificate_retriever.rs b/mithril-common/src/certificate_chain/certificate_retriever.rs index 734c261890a..77866c2bf13 100644 --- a/mithril-common/src/certificate_chain/certificate_retriever.rs +++ b/mithril-common/src/certificate_chain/certificate_retriever.rs @@ -15,8 +15,8 @@ pub struct CertificateRetrieverError(#[source] pub StdError); /// CertificateRetriever is in charge of retrieving a [Certificate] given its hash #[cfg_attr(test, automock)] -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] pub trait CertificateRetriever: Sync + Send { /// Get [Certificate] details async fn get_certificate_details( diff --git a/mithril-common/src/certificate_chain/certificate_verifier.rs b/mithril-common/src/certificate_chain/certificate_verifier.rs index a934f2edf15..24e2546f14d 100644 --- a/mithril-common/src/certificate_chain/certificate_verifier.rs +++ b/mithril-common/src/certificate_chain/certificate_verifier.rs @@ -60,8 +60,8 @@ pub enum CertificateVerifierError { /// CertificateVerifier is the cryptographic engine in charge of verifying multi signatures and /// [certificates](Certificate) #[cfg_attr(test, automock)] -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] pub trait CertificateVerifier: Send + Sync { /// Verify Genesis certificate async fn verify_genesis_certificate( @@ -233,8 +233,8 @@ impl MithrilCertificateVerifier { } } -#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] -#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] impl CertificateVerifier for MithrilCertificateVerifier { /// Verify Genesis certificate async fn verify_genesis_certificate( diff --git a/mithril-common/src/chain_observer/builder.rs b/mithril-common/src/chain_observer/builder.rs new file mode 100644 index 00000000000..339faf68f41 --- /dev/null +++ b/mithril-common/src/chain_observer/builder.rs @@ -0,0 +1,95 @@ +use serde::{Deserialize, Serialize}; +use std::{fmt::Display, path::PathBuf, sync::Arc}; +use thiserror::Error; + +use crate::{chain_observer::ChainObserver, CardanoNetwork, StdResult}; + +#[cfg(any(test, feature = "test_tools"))] +use super::FakeObserver; +use super::{CardanoCliChainObserver, CardanoCliRunner, PallasChainObserver}; + +/// Type of chain observers available +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "lowercase")] +pub enum ChainObserverType { + /// Cardano Cli chain observer. + #[serde(rename = "cardano-cli")] + CardanoCli, + /// Pallas chain observer. + Pallas, + /// Fake chain observer. + #[cfg(any(test, feature = "test_tools"))] + Fake, +} + +impl Display for ChainObserverType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::CardanoCli => write!(f, "cardano-cli"), + Self::Pallas => write!(f, "pallas"), + #[cfg(any(test, feature = "test_tools"))] + Self::Fake => write!(f, "fake"), + } + } +} + +/// Error type for chain observer builder service. +#[derive(Error, Debug)] +pub enum ChainObserverBuilderError { + /// Missing cardano cli runner error. + #[error("cardano cli runner is missing")] + MissingCardanoCliRunner, +} + +/// Chain observer builder +pub struct ChainObserverBuilder { + chain_observer_type: ChainObserverType, + cardano_node_socket_path: PathBuf, + cardano_network: CardanoNetwork, + cardano_cli_runner: Option>, +} + +impl ChainObserverBuilder { + /// Chain observer builder factory + pub fn new( + chain_observer_type: &ChainObserverType, + cardano_node_socket_path: &PathBuf, + cardano_node_network: &CardanoNetwork, + cardano_cli_runner: Option<&CardanoCliRunner>, + ) -> Self { + Self { + chain_observer_type: chain_observer_type.to_owned(), + cardano_node_socket_path: cardano_node_socket_path.to_owned(), + cardano_network: cardano_node_network.to_owned(), + cardano_cli_runner: cardano_cli_runner.map(|c| c.to_owned().into()), + } + } + + /// Create chain observer + pub fn build(&self) -> StdResult> { + match self.chain_observer_type { + ChainObserverType::CardanoCli => Ok(Arc::new(CardanoCliChainObserver::new( + self.cardano_cli_runner + .as_ref() + .ok_or(ChainObserverBuilderError::MissingCardanoCliRunner)? + .to_owned(), + ))), + ChainObserverType::Pallas => { + let fallback = CardanoCliChainObserver::new( + self.cardano_cli_runner + .as_ref() + .ok_or(ChainObserverBuilderError::MissingCardanoCliRunner)? + .to_owned(), + ); + let observer = PallasChainObserver::new( + &self.cardano_node_socket_path, + self.cardano_network, + fallback, + ); + Ok(Arc::new(observer)) + } + #[cfg(any(test, feature = "test_tools"))] + ChainObserverType::Fake => Ok(Arc::new(FakeObserver::default())), + } + } +} diff --git a/mithril-common/src/chain_observer/cli_observer.rs b/mithril-common/src/chain_observer/cli_observer.rs index 5e6d367ed09..fb9a455f7d9 100644 --- a/mithril-common/src/chain_observer/cli_observer.rs +++ b/mithril-common/src/chain_observer/cli_observer.rs @@ -492,8 +492,8 @@ mod tests { #[tokio::test] async fn test_cli_testnet_runner() { let runner = CardanoCliRunner::new( - PathBuf::new().join("cardano-cli"), - PathBuf::new().join("/tmp/whatever.sock"), + PathBuf::from("cardano-cli"), + PathBuf::from("/tmp/whatever.sock"), CardanoNetwork::TestNet(10), ); @@ -504,8 +504,8 @@ mod tests { #[tokio::test] async fn test_cli_devnet_runner() { let runner = CardanoCliRunner::new( - PathBuf::new().join("cardano-cli"), - PathBuf::new().join("/tmp/whatever.sock"), + PathBuf::from("cardano-cli"), + PathBuf::from("/tmp/whatever.sock"), CardanoNetwork::DevNet(25), ); @@ -516,8 +516,8 @@ mod tests { #[tokio::test] async fn test_cli_mainnet_runner() { let runner = CardanoCliRunner::new( - PathBuf::new().join("cardano-cli"), - PathBuf::new().join("/tmp/whatever.sock"), + PathBuf::from("cardano-cli"), + PathBuf::from("/tmp/whatever.sock"), CardanoNetwork::MainNet, ); @@ -589,6 +589,10 @@ mod tests { .await .unwrap() .unwrap(); + println!( + "computed_stake_distribution: {:?}", + computed_stake_distribution + ); let mut expected_stake_distribution = StakeDistribution::new(); expected_stake_distribution.insert( "pool1qqqqqdk4zhsjuxxd8jyvwncf5eucfskz0xjjj64fdmlgj735lr9".to_string(), diff --git a/mithril-common/src/chain_observer/mod.rs b/mithril-common/src/chain_observer/mod.rs index 075cee65fbf..0d4b1ad520e 100644 --- a/mithril-common/src/chain_observer/mod.rs +++ b/mithril-common/src/chain_observer/mod.rs @@ -1,24 +1,23 @@ //! Tools to request metadata, like the current epoch or the stake distribution, from the Cardano +#[cfg(all(feature = "fs", feature = "random"))] +mod builder; #[cfg(all(feature = "fs", feature = "random"))] mod cli_observer; -#[cfg(feature = "test_tools")] -mod fake_observer; mod interface; mod model; #[cfg(all(feature = "fs", feature = "random"))] mod pallas_observer; -#[cfg(test)] +#[cfg(all(test, feature = "fs", feature = "random"))] mod test_cli_runner; -#[cfg(test)] +#[cfg(all(feature = "fs", feature = "random"))] +pub use builder::{ChainObserverBuilder, ChainObserverType}; +#[cfg(all(feature = "fs", feature = "random"))] pub use cli_observer::CliRunner; - #[cfg(all(feature = "fs", feature = "random"))] pub use cli_observer::{CardanoCliChainObserver, CardanoCliRunner}; -#[cfg(feature = "test_tools")] -pub use fake_observer::FakeObserver; #[cfg(test)] pub use interface::MockChainObserver; pub use interface::{ChainObserver, ChainObserverError}; @@ -27,3 +26,9 @@ pub use model::{ }; #[cfg(all(feature = "fs", feature = "random"))] pub use pallas_observer::PallasChainObserver; + +cfg_test_tools! { + mod fake_observer; + + pub use fake_observer::FakeObserver; +} diff --git a/mithril-common/src/chain_observer/model.rs b/mithril-common/src/chain_observer/model.rs index 00d04cb65fe..daaa794a641 100644 --- a/mithril-common/src/chain_observer/model.rs +++ b/mithril-common/src/chain_observer/model.rs @@ -7,6 +7,45 @@ use thiserror::Error; use crate::{StdError, StdResult}; +cfg_fs! { + use serde::Deserialize; + use anyhow::Context; + use minicbor::{Decode, Decoder, decode}; + use pallas_primitives::{alonzo::PlutusData, ToCanonicalJson}; + /// [Datum] represents an inline datum from UTxO. + #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] + #[serde(rename_all = "lowercase")] + pub struct Datum(pub PlutusData); + + impl ToCanonicalJson for Datum { + fn to_json(&self) -> serde_json::Value { + self.0.to_json() + } + } + + impl<'a, C> Decode<'a, C> for Datum { + fn decode(d: &mut Decoder<'a>, ctx: &mut C) -> Result { + PlutusData::decode(d, ctx).map(Datum) + } + } + + /// Inspects the given bytes and returns a decoded `R` instance. + pub fn try_inspect(inner: Vec) -> StdResult + where + for<'b> R: Decode<'b, ()>, + { + decode(&inner).map_err(|e| anyhow!(e)).with_context(|| { + format!( + "failed to decode datum: {}", + hex::encode(&inner) + ) + }) + } + + /// [Datums] represents a list of [TxDatum]. + pub type Datums = Vec; +} + /// [ChainAddress] represents an on chain address. pub type ChainAddress = String; diff --git a/mithril-common/src/chain_observer/pallas_observer.rs b/mithril-common/src/chain_observer/pallas_observer.rs index fafdaf53977..c16711aadc0 100644 --- a/mithril-common/src/chain_observer/pallas_observer.rs +++ b/mithril-common/src/chain_observer/pallas_observer.rs @@ -1,8 +1,24 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; -use pallas_network::facades::NodeClient; -use pallas_network::miniprotocols::localstate::{queries_v16, Client}; -use std::path::{Path, PathBuf}; +use bech32::{self, ToBase32, Variant}; +use pallas_addresses::Address; +use pallas_codec::utils::{Bytes, CborWrap, TagWrap}; +use pallas_network::{ + facades::NodeClient, + miniprotocols::localstate::{ + queries_v16::{ + self, Addr, Addrs, PostAlonsoTransactionOutput, StakeSnapshot, Stakes, + TransactionOutput, UTxOByAddress, + }, + Client, + }, +}; + +use pallas_primitives::ToCanonicalJson; +use std::{ + collections::BTreeSet, + path::{Path, PathBuf}, +}; use crate::chain_observer::interface::*; use crate::chain_observer::{ChainAddress, TxDatum}; @@ -11,6 +27,7 @@ use crate::entities::StakeDistribution; use crate::CardanoNetwork; use crate::{entities::Epoch, StdResult}; +use super::model::{try_inspect, Datum, Datums}; use super::CardanoCliChainObserver; /// A runner that uses Pallas library to interact with a Cardano node using N2C Ouroboros mini-protocols @@ -54,7 +71,7 @@ impl PallasChainObserver { self.new_client() .await .map_err(|err| anyhow!(err)) - .with_context(|| "PallasChainObserver Failed to create new client") + .with_context(|| "PallasChainObserver failed to create new client") } /// Fetches the current epoch number using the provided `statequery` client. @@ -63,21 +80,163 @@ impl PallasChainObserver { .acquire(None) .await .map_err(|err| anyhow!(err)) - .with_context(|| "PallasChainObserver Failed to acquire statequery")?; + .with_context(|| "PallasChainObserver failed to acquire statequery")?; let era = queries_v16::get_current_era(statequery) .await .map_err(|err| anyhow!(err)) - .with_context(|| "PallasChainObserver Failed to get current era")?; + .with_context(|| "PallasChainObserver failed to get current era")?; let epoch = queries_v16::get_block_epoch_number(statequery, era) .await .map_err(|err| anyhow!(err)) - .with_context(|| "PallasChainObserver Failed to get block epoch number")?; + .with_context(|| "PallasChainObserver failed to get block epoch number")?; Ok(epoch) } + /// Returns inline datum tag from the given `Values` instance. + fn get_datum_tag(&self, utxo: &PostAlonsoTransactionOutput) -> StdResult> { + Ok(utxo + .inline_datum + .as_ref() + .with_context(|| "PallasChainObserver failed to get inline datum")? + .1 + .clone()) + } + + /// Returns inline datums from the given `Values` instance. + fn inspect_datum(&self, utxo: &PostAlonsoTransactionOutput) -> StdResult { + let datum = self.get_datum_tag(utxo)?; + let datum = CborWrap(datum).to_vec(); + + try_inspect::(datum) + } + + /// Serializes datum to `TxDatum` instance. + fn serialize_datum(&self, utxo: &PostAlonsoTransactionOutput) -> StdResult { + let datum = self.inspect_datum(utxo)?; + let serialized = serde_json::to_string(&datum.to_json()) + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to serialize datum")?; + + Ok(TxDatum(serialized)) + } + + /// Maps the given `UTxOByAddress` instance to Datums. + fn map_datums(&self, transaction: UTxOByAddress) -> StdResult { + transaction + .utxo + .iter() + .filter_map(|(_, utxo)| match utxo { + TransactionOutput::Current(output) => output + .inline_datum + .as_ref() + .map(|_| self.serialize_datum(output)), + _ => None, + }) + .collect::>() + } + + /// Returns a vector of `TxDatum` instances. + async fn get_utxo_datums( + &self, + client: &mut NodeClient, + address: &ChainAddress, + ) -> Result { + let statequery = client.statequery(); + let utxo = self.get_utxo_by_address(statequery, address).await?; + + Ok(self.map_datums(utxo)?) + } + + /// Fetches the current UTxO by address using the provided `statequery` client. + async fn get_utxo_by_address( + &self, + statequery: &mut Client, + address: &ChainAddress, + ) -> StdResult { + statequery + .acquire(None) + .await + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to acquire statequery")?; + + let era = queries_v16::get_current_era(statequery) + .await + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to get current era")?; + + let addr: Address = Address::from_bech32(address) + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to parse address")?; + + let addr: Addr = addr.to_vec().into(); + let addrs: Addrs = vec![addr]; + let utxo = queries_v16::get_utxo_by_address(statequery, era, addrs) + .await + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to get utxo")?; + + Ok(utxo) + } + + /// Fetches the current stake distribution using the provided `statequery` client. + async fn do_stake_snapshots_state_query( + &self, + statequery: &mut Client, + ) -> StdResult { + statequery + .acquire(None) + .await + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to acquire statequery")?; + + let era = queries_v16::get_current_era(statequery) + .await + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to get current era")?; + + let state_snapshot = queries_v16::get_stake_snapshots(statequery, era, BTreeSet::new()) + .await + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to get stake snapshot")?; + + Ok(state_snapshot) + } + + fn get_stake_pool_hash( + &self, + key: &Bytes, + stakes: &Stakes, + ) -> Result<(String, u64), ChainObserverError> { + let pool_hash = bech32::encode("pool", key.to_base32(), Variant::Bech32) + .map_err(|err| anyhow!(err)) + .with_context(|| "PallasChainObserver failed to encode stake pool hash")?; + + Ok((pool_hash, stakes.snapshot_mark_pool)) + } + + async fn get_stake_distribution_snapshot( + &self, + client: &mut NodeClient, + ) -> Result, ChainObserverError> { + let statequery = client.statequery(); + + let stake_snapshot = self.do_stake_snapshots_state_query(statequery).await?; + + let mut stake_distribution = StakeDistribution::new(); + + for (key, stakes) in stake_snapshot.snapshots.stake_snapshots.iter() { + if stakes.snapshot_mark_pool > 0 { + let (pool_hash, stake) = self.get_stake_pool_hash(key, stakes)?; + stake_distribution.insert(pool_hash, stake); + } + } + + Ok(Some(stake_distribution)) + } + /// Processes a state query with the `NodeClient`, releasing the state query. async fn process_statequery(&self, client: &mut NodeClient) -> StdResult<()> { let statequery = client.statequery(); @@ -125,7 +284,7 @@ impl ChainObserver for PallasChainObserver { self.post_process_statequery(&mut client).await?; - drop(client.plexer_handle); + client.abort().await; Ok(Some(Epoch(epoch as u64))) } @@ -133,16 +292,30 @@ impl ChainObserver for PallasChainObserver { async fn get_current_datums( &self, address: &ChainAddress, - ) -> Result, ChainObserverError> { - let fallback = self.get_fallback(); - fallback.get_current_datums(address).await + ) -> Result { + let mut client = self.get_client().await?; + + let datums = self.get_utxo_datums(&mut client, address).await?; + + self.post_process_statequery(&mut client).await?; + + client.abort().await; + + Ok(datums) } async fn get_current_stake_distribution( &self, ) -> Result, ChainObserverError> { - let fallback = self.get_fallback(); - fallback.get_current_stake_distribution().await + let mut client = self.get_client().await?; + + let stake_pools = self.get_stake_distribution_snapshot(&mut client).await?; + + self.post_process_statequery(&mut client).await?; + + client.abort().await; + + Ok(stake_pools) } async fn get_current_kes_period( @@ -158,13 +331,106 @@ impl ChainObserver for PallasChainObserver { mod tests { use std::fs; - use pallas_codec::utils::AnyCbor; - use pallas_network::miniprotocols::localstate::{self, ClientQueryRequest}; + use pallas_codec::utils::{AnyCbor, AnyUInt, KeyValuePairs, TagWrap}; + use pallas_crypto::hash::Hash; + use pallas_network::miniprotocols::localstate::{self, queries_v16::Value, ClientQueryRequest}; use tokio::net::UnixListener; use super::*; use crate::{chain_observer::test_cli_runner::TestCliRunner, CardanoNetwork}; + fn get_fake_utxo_by_address() -> UTxOByAddress { + let tx_hex = "1e4e5cf2889d52f1745b941090f04a65dea6ce56c5e5e66e69f65c8e36347c17"; + let txbytes: [u8; 32] = hex::decode(tx_hex).unwrap().try_into().unwrap(); + let transaction_id = Hash::from(txbytes); + let index = AnyUInt::MajorByte(2); + let lovelace = AnyUInt::MajorByte(2); + let hex_datum = "D8799F58407B226D61726B657273223A5B7B226E616D65223A227468616C6573222C2265706F6368223A307D5D2C227369676E6174757265223A22383566323265626261645840333335376338656132646630363230393766396131383064643335643966336261316432363832633732633864313232383866616438636238643063656565625838366134643665383465653865353631376164323037313836366363313930373466326137366538373864663166393733346438343061227DFF"; + let datum = hex::decode(hex_datum).unwrap().into(); + let tag = TagWrap::<_, 24>::new(datum); + let inline_datum = Some((1_u16, tag)); + + let address: Address = + Address::from_bech32("addr_test1vr80076l3x5uw6n94nwhgmv7ssgy6muzf47ugn6z0l92rhg2mgtu0") + .unwrap(); + let address: Addr = address.to_vec().into(); + let values = localstate::queries_v16::TransactionOutput::Current( + localstate::queries_v16::PostAlonsoTransactionOutput { + address, + amount: Value::Coin(lovelace), + inline_datum, + script_ref: None, + }, + ); + let utxo = KeyValuePairs::from(vec![( + localstate::queries_v16::UTxO { + transaction_id, + index, + }, + values, + )]); + + localstate::queries_v16::UTxOByAddress { utxo } + } + + fn get_fake_stake_snapshot() -> StakeSnapshot { + let stake_snapshots = KeyValuePairs::from(vec![ + ( + Bytes::from( + hex::decode("00000036d515e12e18cd3c88c74f09a67984c2c279a5296aa96efe89") + .unwrap(), + ), + localstate::queries_v16::Stakes { + snapshot_mark_pool: 300000000001, + snapshot_set_pool: 300000000002, + snapshot_go_pool: 300000000000, + }, + ), + ( + Bytes::from( + hex::decode("000000f66e28b0f18aef20555f4c4954234e3270dfbbdcc13f54e799") + .unwrap(), + ), + localstate::queries_v16::Stakes { + snapshot_mark_pool: 600000000001, + snapshot_set_pool: 600000000002, + snapshot_go_pool: 600000000000, + }, + ), + ( + Bytes::from( + hex::decode("00000110093effbf3ce788aebd3e7506b80322bd3995ad432e61fad5") + .unwrap(), + ), + localstate::queries_v16::Stakes { + snapshot_mark_pool: 1200000000001, + snapshot_set_pool: 1200000000002, + snapshot_go_pool: 1200000000000, + }, + ), + ( + Bytes::from( + hex::decode("00000ffff93effbf3ce788aebd3e7506b80322bd3995ad432e61fad5") + .unwrap(), + ), + localstate::queries_v16::Stakes { + snapshot_mark_pool: 0, + snapshot_set_pool: 1300000000002, + snapshot_go_pool: 0, + }, + ), + ]); + + localstate::queries_v16::StakeSnapshot { + snapshots: localstate::queries_v16::Snapshots { + stake_snapshots, + snapshot_stake_mark_total: 2100000000003, + snapshot_stake_set_total: 2100000000006, + snapshot_stake_go_total: 2100000000000, + }, + } + } + /// pallas responses mock server. async fn mock_server(server: &mut pallas_network::facades::NodeServer) -> AnyCbor { let query: localstate::queries_v16::Request = @@ -185,6 +451,18 @@ mod tests { localstate::queries_v16::BlockQuery::GetEpochNo, ), ) => AnyCbor::from_encode([8]), + localstate::queries_v16::Request::LedgerQuery( + localstate::queries_v16::LedgerQuery::BlockQuery( + _, + localstate::queries_v16::BlockQuery::GetUTxOByAddress(_), + ), + ) => AnyCbor::from_encode(get_fake_utxo_by_address()), + localstate::queries_v16::Request::LedgerQuery( + localstate::queries_v16::LedgerQuery::BlockQuery( + _, + localstate::queries_v16::BlockQuery::GetStakeSnapshots(_), + ), + ) => AnyCbor::from_encode(get_fake_stake_snapshot()), _ => panic!("unexpected query from client: {query:?}"), } } @@ -244,4 +522,60 @@ mod tests { let epoch = client_res.expect("Client failed"); assert_eq!(epoch, 8); } + + #[tokio::test] + async fn get_current_datums_with_fallback() { + let server = setup_server().await; + let client = tokio::spawn(async move { + let socket_path = std::env::temp_dir().join("pallas_chain_observer_test/node.socket"); + let fallback = CardanoCliChainObserver::new(Box::::default()); + let observer = super::PallasChainObserver::new( + socket_path.as_path(), + CardanoNetwork::TestNet(10), + fallback, + ); + let address = + "addr_test1vr80076l3x5uw6n94nwhgmv7ssgy6muzf47ugn6z0l92rhg2mgtu0".to_string(); + observer.get_current_datums(&address).await.unwrap() + }); + + let (_, client_res) = tokio::join!(server, client); + let datums = client_res.expect("Client failed"); + assert_eq!(vec![TxDatum(r#"{"constructor":0,"fields":[{"bytes":"7b226d61726b657273223a5b7b226e616d65223a227468616c6573222c2265706f6368223a307d5d2c227369676e6174757265223a2238356632326562626164"},{"bytes":"33333537633865613264663036323039376639613138306464333564396633626131643236383263373263386431323238386661643863623864306365656562"},{"bytes":"366134643665383465653865353631376164323037313836366363313930373466326137366538373864663166393733346438343061227d"}]}"#.to_string())], datums); + } + + #[tokio::test] + async fn get_current_stake_distribution_fallback() { + let server = setup_server().await; + + let client = tokio::spawn(async move { + let socket_path = std::env::temp_dir().join("pallas_chain_observer_test/node.socket"); + let fallback = CardanoCliChainObserver::new(Box::::default()); + let observer = super::PallasChainObserver::new( + socket_path.as_path(), + CardanoNetwork::TestNet(10), + fallback, + ); + observer.get_current_stake_distribution().await.unwrap() + }); + + let (_, client_res) = tokio::join!(server, client); + let computed_stake_distribution = client_res.unwrap().unwrap(); + + let mut expected_stake_distribution = StakeDistribution::new(); + expected_stake_distribution.insert( + "pool1qqqqqdk4zhsjuxxd8jyvwncf5eucfskz0xjjj64fdmlgj735lr9".to_string(), + 300000000001, + ); + expected_stake_distribution.insert( + "pool1qqqqpanw9zc0rzh0yp247nzf2s35uvnsm7aaesfl2nnejaev0uc".to_string(), + 600000000001, + ); + expected_stake_distribution.insert( + "pool1qqqqzyqf8mlm70883zht60n4q6uqxg4a8x266sewv8ad2grkztl".to_string(), + 1200000000001, + ); + + assert_eq!(expected_stake_distribution, computed_stake_distribution); + } } diff --git a/mithril-common/src/crypto_helper/cardano/cold_key.rs b/mithril-common/src/crypto_helper/cardano/cold_key.rs index 67c5e0caa67..bc6d4f12521 100644 --- a/mithril-common/src/crypto_helper/cardano/cold_key.rs +++ b/mithril-common/src/crypto_helper/cardano/cold_key.rs @@ -3,11 +3,14 @@ use rand_chacha::ChaCha20Rng; use rand_core::SeedableRng; /// A cold key generator / test only +#[doc(hidden)] #[derive(Debug)] pub struct ColdKeyGenerator(); impl ColdKeyGenerator { - pub(crate) fn create_deterministic_keypair(seed: [u8; 32]) -> ColdSecretKey { + #[doc(hidden)] + /// Create a deterministic secret key using the given seed. (test only) + pub fn create_deterministic_keypair(seed: [u8; 32]) -> ColdSecretKey { let mut rng = ChaCha20Rng::from_seed(seed); ColdSecretKey::generate(&mut rng) } diff --git a/mithril-common/src/crypto_helper/cardano/mod.rs b/mithril-common/src/crypto_helper/cardano/mod.rs index 4c89902a20e..0d6d59317f5 100644 --- a/mithril-common/src/crypto_helper/cardano/mod.rs +++ b/mithril-common/src/crypto_helper/cardano/mod.rs @@ -1,11 +1,13 @@ mod codec; -#[cfg(feature = "random")] -mod cold_key; mod key_certification; mod opcert; pub use codec::*; -#[cfg(feature = "random")] -pub use cold_key::*; pub use key_certification::*; pub use opcert::*; + +cfg_random! { + mod cold_key; + + pub use cold_key::*; +} diff --git a/mithril-common/src/crypto_helper/era.rs b/mithril-common/src/crypto_helper/era.rs index e119a349168..abff325b95b 100644 --- a/mithril-common/src/crypto_helper/era.rs +++ b/mithril-common/src/crypto_helper/era.rs @@ -49,12 +49,12 @@ impl EraMarkersSigner { Self::create_test_signer(rng) } - cfg_random! { - /// [EraMarkersSigner] non deterministic - pub fn create_non_deterministic_signer() -> Self { - let rng = rand_core::OsRng; - Self::create_test_signer(rng) - } + #[cfg(any(test, feature = "random"))] + #[cfg_attr(docsrs, doc(cfg(feature = "random")))] + /// [EraMarkersSigner] non deterministic + pub fn create_non_deterministic_signer() -> Self { + let rng = rand_core::OsRng; + Self::create_test_signer(rng) } /// [EraMarkersSigner] from [EraMarkersVerifierSecretKey] diff --git a/mithril-common/src/crypto_helper/merkle_tree.rs b/mithril-common/src/crypto_helper/merkle_tree.rs new file mode 100644 index 00000000000..ac0178b2327 --- /dev/null +++ b/mithril-common/src/crypto_helper/merkle_tree.rs @@ -0,0 +1,302 @@ +use anyhow::anyhow; +#[cfg(any(test, feature = "test_tools"))] +use anyhow::Context; +use blake2::{Blake2s256, Digest}; +use ckb_merkle_mountain_range::{util::MemStore, Merge, MerkleProof, Result as MMRResult, MMR}; +use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, ops::Deref}; + +use crate::{StdError, StdResult}; + +/// Alias for a byte +type Bytes = Vec; + +/// Alias for a Merkle tree leaf position +type MKTreeLeafPosition = u64; + +/// A node of a Merkle tree +#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)] +pub struct MKTreeNode { + hash: Bytes, +} + +impl MKTreeNode { + /// MKTreeNode factory + pub fn new(hash: Bytes) -> Self { + Self { hash } + } + + /// Create a MKTreeNode from a hex representation + pub fn from_hex(hex: &str) -> StdResult { + let hash = hex::decode(hex)?; + Ok(Self { hash }) + } + + /// Create a hex representation of the MKTreeNode + pub fn to_hex(&self) -> String { + hex::encode(&self.hash) + } +} + +impl Deref for MKTreeNode { + type Target = Bytes; + + fn deref(&self) -> &Self::Target { + &self.hash + } +} + +impl From for MKTreeNode { + fn from(other: String) -> Self { + Self { + hash: other.as_str().into(), + } + } +} + +impl From<&str> for MKTreeNode { + fn from(other: &str) -> Self { + Self { + hash: other.as_bytes().to_vec(), + } + } +} + +impl TryFrom> for MKTreeNode { + type Error = StdError; + fn try_from(other: MKTree) -> Result { + other.compute_root() + } +} + +impl ToString for MKTreeNode { + fn to_string(&self) -> String { + String::from_utf8_lossy(&self.hash).to_string() + } +} + +struct MergeMKTreeNode {} + +impl Merge for MergeMKTreeNode { + type Item = MKTreeNode; + + fn merge(lhs: &Self::Item, rhs: &Self::Item) -> MMRResult { + let mut hasher = Blake2s256::new(); + hasher.update(lhs.deref()); + hasher.update(rhs.deref()); + let hash_merge = hasher.finalize(); + + Ok(Self::Item::new(hash_merge.to_vec())) + } +} + +/// A Merkle proof +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub struct MKProof { + inner_root: MKTreeNode, + inner_leaves: Vec<(MKTreeLeafPosition, MKTreeNode)>, + inner_proof_size: u64, + inner_proof_items: Vec, +} + +impl MKProof { + /// Return a reference to its merkle root. + pub fn root(&self) -> &MKTreeNode { + &self.inner_root + } + + /// Verification of a Merkle proof + pub fn verify(&self) -> StdResult<()> { + MerkleProof::::new( + self.inner_proof_size, + self.inner_proof_items.clone(), + ) + .verify(self.inner_root.to_owned(), self.inner_leaves.to_owned())? + .then_some(()) + .ok_or(anyhow!("Invalid MKProof")) + } + + /// Check if the proof contains the given leaves + pub fn contains(&self, leaves: &[MKTreeNode]) -> StdResult<()> { + leaves + .iter() + .all(|leaf| self.inner_leaves.iter().any(|(_, l)| l == leaf)) + .then_some(()) + .ok_or(anyhow!("Leaves not found in the MKProof")) + } + + cfg_test_tools! { + /// Build a [MKProof] based on the given leaves (*Test only*). + pub fn from_leaves + Clone>( + leaves: &[T], + ) -> StdResult { + Self::from_subset_of_leaves(leaves, leaves) + } + + /// Build a [MKProof] based on the given leaves (*Test only*). + pub fn from_subset_of_leaves + Clone>( + leaves: &[T], + leaves_to_verify: &[T], + ) -> StdResult { + let leaves = Self::list_to_mknode(leaves); + let leaves_to_verify = + Self::list_to_mknode(leaves_to_verify); + + let store = MKTreeStore::default(); + let mktree = + MKTree::new(&leaves, &store).with_context(|| "MKTree creation should not fail")?; + mktree.compute_proof(&leaves_to_verify) + } + + fn list_to_mknode + Clone>(hashes: &[T]) -> Vec { + hashes.iter().map(|h| h.clone().into()).collect() + } + } +} + +/// A Merkle tree store +pub type MKTreeStore = MemStore; + +/// A Merkle tree +pub struct MKTree<'a> { + inner_leaves: HashMap<&'a MKTreeNode, MKTreeLeafPosition>, + inner_tree: MMR, +} + +impl<'a> MKTree<'a> { + /// MKTree factory + pub fn new(leaves: &'a [MKTreeNode], store: &'a MKTreeStore) -> StdResult { + let mut inner_tree = MMR::::new(0, store); + let mut inner_leaves = HashMap::new(); + for leaf in leaves { + let inner_tree_position = inner_tree.push(leaf.to_owned())?; + inner_leaves.insert(leaf, inner_tree_position); + } + inner_tree.commit()?; + + Ok(Self { + inner_leaves, + inner_tree, + }) + } + + /// Number of leaves in the Merkle tree + pub fn total_leaves(&self) -> usize { + self.inner_leaves.len() + } + + /// Generate root of the Merkle tree + pub fn compute_root(&self) -> StdResult { + Ok(self.inner_tree.get_root()?) + } + + /// Generate Merkle proof of memberships in the tree + pub fn compute_proof(&self, leaves: &[MKTreeNode]) -> StdResult { + let inner_leaves = leaves + .iter() + .map(|leaf| { + if let Some(leaf_position) = self.inner_leaves.get(leaf) { + Ok((*leaf_position, leaf.to_owned())) + } else { + Err(anyhow!("Leaf not found in the Merkle tree")) + } + }) + .collect::>>()?; + let proof = self.inner_tree.gen_proof( + inner_leaves + .iter() + .map(|(leaf_position, _leaf)| *leaf_position) + .collect(), + )?; + return Ok(MKProof { + inner_root: self.compute_root()?, + inner_leaves, + inner_proof_size: proof.mmr_size(), + inner_proof_items: proof.proof_items().to_vec(), + }); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn generate_leaves(total_leaves: usize) -> Vec { + (0..total_leaves) + .map(|i| format!("test-{i}").into()) + .collect() + } + + #[test] + fn test_golden_merkle_root() { + let leaves = vec!["golden-1", "golden-2", "golden-3", "golden-4", "golden-5"]; + let leaves: Vec = leaves.into_iter().map(|l| l.into()).collect(); + let store = MKTreeStore::default(); + let mktree = MKTree::new(&leaves, &store).expect("MKTree creation should not fail"); + let mkroot = mktree + .compute_root() + .expect("MKRoot generation should not fail"); + assert_eq!( + "3bbced153528697ecde7345a22e50115306478353619411523e804f2323fd921", + mkroot.to_hex() + ); + } + + #[test] + fn test_should_accept_valid_proof_generated_by_merkle_tree() { + let leaves = generate_leaves(100000); + let leaves_to_verify = &[leaves[0].to_owned(), leaves[3].to_owned()]; + let proof = + MKProof::from_leaves(leaves_to_verify).expect("MKProof generation should not fail"); + proof.verify().expect("The MKProof should be valid"); + } + + #[test] + fn test_should_reject_invalid_proof_generated_by_merkle_tree() { + let leaves = generate_leaves(100000); + let leaves_to_verify = &[leaves[0].to_owned(), leaves[3].to_owned()]; + let mut proof = + MKProof::from_leaves(leaves_to_verify).expect("MKProof generation should not fail"); + proof.inner_root = leaves[10].to_owned(); + proof.verify().expect_err("The MKProof should be invalid"); + } + + #[test] + fn tree_node_from_to_string() { + let expected_str = "my_string"; + let expected_string = expected_str.to_string(); + let node_str: MKTreeNode = expected_str.into(); + let node_string: MKTreeNode = expected_string.clone().into(); + + assert_eq!(node_str.to_string(), expected_str); + assert_eq!(node_string.to_string(), expected_string); + } + + #[test] + fn contains_leaves() { + let mut leaves_to_verify = generate_leaves(10); + let leaves_not_verified = leaves_to_verify.drain(3..6).collect::>(); + let proof = + MKProof::from_leaves(&leaves_to_verify).expect("MKProof generation should not fail"); + + // contains everything + proof.contains(&leaves_to_verify).unwrap(); + + // contains subpart + proof.contains(&leaves_to_verify[0..2]).unwrap(); + + // don't contains all not verified + proof.contains(&leaves_not_verified).unwrap_err(); + + // don't contains subpart of not verified + proof.contains(&leaves_not_verified[1..2]).unwrap_err(); + + // fail if part verified and part unverified + proof + .contains(&[ + leaves_to_verify[2].to_owned(), + leaves_not_verified[0].to_owned(), + ]) + .unwrap_err(); + } +} diff --git a/mithril-common/src/crypto_helper/mod.rs b/mithril-common/src/crypto_helper/mod.rs index 998b5df8523..58b8989156d 100644 --- a/mithril-common/src/crypto_helper/mod.rs +++ b/mithril-common/src/crypto_helper/mod.rs @@ -5,12 +5,16 @@ mod codec; mod conversions; mod era; mod genesis; -#[cfg(feature = "test_tools")] -pub mod tests_setup; +mod merkle_tree; mod types; -#[cfg(feature = "random")] -pub use cardano::ColdKeyGenerator; +cfg_test_tools! { + pub mod tests_setup; +} + +cfg_random! { + pub use cardano::ColdKeyGenerator; +} pub use cardano::{ KESPeriod, OpCert, ProtocolInitializerErrorWrapper, ProtocolRegistrationErrorWrapper, @@ -22,6 +26,7 @@ pub use era::{ EraMarkersVerifierSignature, EraMarkersVerifierVerificationKey, }; pub use genesis::{ProtocolGenesisError, ProtocolGenesisSigner, ProtocolGenesisVerifier}; +pub use merkle_tree::{MKProof, MKTree, MKTreeNode, MKTreeStore}; pub use types::*; /// The current protocol version diff --git a/mithril-common/src/crypto_helper/types/wrappers.rs b/mithril-common/src/crypto_helper/types/wrappers.rs index 6a6390ba20e..44bc84ff66f 100644 --- a/mithril-common/src/crypto_helper/types/wrappers.rs +++ b/mithril-common/src/crypto_helper/types/wrappers.rs @@ -3,7 +3,7 @@ use hex::{FromHex, ToHex}; use kes_summed_ed25519::kes::Sum6KesSig; use mithril_stm::stm::{StmAggrSig, StmAggrVerificationKey, StmSig, StmVerificationKeyPoP}; -use crate::crypto_helper::{OpCert, ProtocolKey, ProtocolKeyCodec, D}; +use crate::crypto_helper::{MKProof, OpCert, ProtocolKey, ProtocolKeyCodec, D}; use crate::StdResult; /// Wrapper of [MithrilStm:StmVerificationKeyPoP](type@StmVerificationKeyPoP) to add serialization @@ -35,6 +35,9 @@ pub type ProtocolGenesisSecretKey = ProtocolKey; /// Wrapper of [MithrilStm:StmAggrVerificationKey](struct@StmAggrVerificationKey). pub type ProtocolAggregateVerificationKey = ProtocolKey>; +/// Wrapper of [MKProof] to add serialization utilities. +pub type ProtocolMkProof = ProtocolKey; + impl ProtocolGenesisSignature { /// Create an instance from a bytes hex representation pub fn from_bytes_hex(hex_string: &str) -> StdResult { @@ -80,6 +83,7 @@ impl ProtocolKeyCodec for ed25519_dalek::Signature { impl_codec_and_type_conversions_for_protocol_key!( json_hex_codec => StmVerificationKeyPoP, Sum6KesSig, StmSig, StmAggrSig, OpCert, - ed25519_dalek::VerifyingKey, ed25519_dalek::SigningKey, StmAggrVerificationKey + ed25519_dalek::VerifyingKey, ed25519_dalek::SigningKey, StmAggrVerificationKey, + MKProof ); impl_codec_and_type_conversions_for_protocol_key!(no_default_codec => ed25519_dalek::Signature); diff --git a/mithril-common/src/digesters/immutable_file.rs b/mithril-common/src/digesters/immutable_file.rs index 810438774bb..02fcdb54d71 100644 --- a/mithril-common/src/digesters/immutable_file.rs +++ b/mithril-common/src/digesters/immutable_file.rs @@ -1,9 +1,9 @@ use crate::entities::{ImmutableFileName, ImmutableFileNumber}; +use crate::digesters::ImmutableFileListingError::MissingImmutableFolder; use digest::{Digest, Output}; use std::{ cmp::Ordering, - ffi::OsStr, fs::File, io, num::ParseIntError, @@ -12,9 +12,23 @@ use std::{ use thiserror::Error; use walkdir::WalkDir; -fn is_immutable(path: &Path) -> bool { - let immutable = OsStr::new("immutable"); - path.iter().any(|component| component == immutable) +const IMMUTABLE_FILE_EXTENSIONS: [&str; 3] = ["chunk", "primary", "secondary"]; + +fn is_immutable(entry: &walkdir::DirEntry) -> bool { + let is_file = entry.file_type().is_file(); + let extension = entry.path().extension().map(|e| e.to_string_lossy()); + + is_file && extension.is_some_and(|e| IMMUTABLE_FILE_EXTENSIONS.contains(&e.as_ref())) +} + +/// Walk the given path and return the first directory named "immutable" it finds +fn find_immutables_dir(path_to_walk: &Path) -> Option { + WalkDir::new(path_to_walk) + .into_iter() + .filter_entry(|e| e.file_type().is_dir()) + .filter_map(|e| e.ok()) + .find(|f| f.file_name() == "immutable") + .map(|e| e.into_path()) } /// Represent an immutable file in a Cardano node database directory @@ -62,6 +76,10 @@ pub enum ImmutableFileListingError { /// Raised when [ImmutableFile::new] fails. #[error("immutable file creation error")] ImmutableFileCreation(#[from] ImmutableFileCreationError), + + /// Raised when the "immutable" folder could not be found in a file structure. + #[error("Couldn't find the 'immutable' folder in '{0:?}'")] + MissingImmutableFolder(PathBuf), } impl ImmutableFile { @@ -116,23 +134,34 @@ impl ImmutableFile { pub fn list_completed_in_dir( dir: &Path, ) -> Result, ImmutableFileListingError> { + let immutable_dir = + find_immutables_dir(dir).ok_or(MissingImmutableFolder(dir.to_path_buf()))?; let mut files: Vec = vec![]; - for path in WalkDir::new(dir) + for path in WalkDir::new(immutable_dir) + .min_depth(1) + .max_depth(1) .into_iter() + .filter_entry(is_immutable) .filter_map(|file| file.ok()) - .map(|f| f.path().to_owned()) { - let metadata = path.metadata()?; - if metadata.is_file() && is_immutable(&path) { - let immutable_file = ImmutableFile::new(path)?; - files.push(immutable_file); - } + let immutable_file = ImmutableFile::new(path.into_path())?; + files.push(immutable_file); } files.sort(); - // @todo: make the skip of the last 'trio' more robust - Ok(files.into_iter().rev().skip(3).rev().collect()) + match files.last() { + // empty list + None => Ok(files), + // filter out the last immutable file(s) + Some(last_file) => { + let last_number = last_file.number; + Ok(files + .into_iter() + .filter(|f| f.number < last_number) + .collect()) + } + } } } @@ -179,6 +208,23 @@ mod tests { } } + fn extract_filenames(immutables: &[ImmutableFile]) -> Vec { + immutables + .iter() + .map(|i| i.path.file_name().unwrap().to_str().unwrap().to_owned()) + .collect() + } + + #[test] + fn list_immutable_file_fail_if_not_in_immutable_dir() { + let target_dir = get_test_dir("list_immutable_file_fail_if_not_in_immutable_dir/invalid"); + let entries = vec![]; + create_fake_files(&target_dir, &entries); + + ImmutableFile::list_completed_in_dir(target_dir.parent().unwrap()) + .expect_err("ImmutableFile::list_in_dir should have Failed"); + } + #[test] fn list_immutable_file_should_skip_last_number() { let target_dir = get_test_dir("list_immutable_file_should_skip_last_number/immutable"); @@ -260,12 +306,59 @@ mod tests { create_fake_files(&target_dir, &entries); let immutables = ImmutableFile::list_completed_in_dir(target_dir.parent().unwrap()) .expect("ImmutableFile::list_in_dir Failed"); - let immutables_names: Vec = immutables - .into_iter() - .map(|i| i.path.file_name().unwrap().to_str().unwrap().to_owned()) - .collect(); + let immutables_names: Vec = extract_filenames(&immutables); let expected: Vec<&str> = entries.into_iter().rev().skip(3).rev().collect(); assert_eq!(expected, immutables_names); } + + #[test] + fn list_immutable_file_should_work_with_non_immutable_files() { + let target_dir = + get_test_dir("list_immutable_file_should_work_with_non_immutable_files/immutable"); + let entries = vec![ + "123.chunk", + "123.primary", + "123.secondary", + "124.chunk", + "124.primary", + "124.secondary", + "README.md", + "124.secondary.back", + ]; + create_fake_files(&target_dir, &entries); + let immutables = ImmutableFile::list_completed_in_dir(target_dir.parent().unwrap()) + .expect("ImmutableFile::list_in_dir Failed"); + let immutables_names: Vec = extract_filenames(&immutables); + + let expected: Vec<&str> = entries.into_iter().rev().skip(5).rev().collect(); + assert_eq!(expected, immutables_names); + } + + #[test] + fn list_immutable_file_can_list_incomplete_trio() { + let target_dir = get_test_dir("list_immutable_file_can_list_incomplete_trio/immutable"); + let entries = vec![ + "21.chunk", + "21.primary", + "21.secondary", + "123.chunk", + "123.secondary", + "124.chunk", + "124.primary", + "125.primary", + "125.secondary", + "223.chunk", + "224.primary", + "225.secondary", + "226.chunk", + ]; + create_fake_files(&target_dir, &entries); + let immutables = ImmutableFile::list_completed_in_dir(target_dir.parent().unwrap()) + .expect("ImmutableFile::list_in_dir Failed"); + let immutables_names: Vec = extract_filenames(&immutables); + + let expected: Vec<&str> = entries.into_iter().rev().skip(1).rev().collect(); + assert_eq!(expected, immutables_names); + } } diff --git a/mithril-common/src/entities/cardano_network.rs b/mithril-common/src/entities/cardano_network.rs index 4707dc9ca70..1ea3990ba79 100644 --- a/mithril-common/src/entities/cardano_network.rs +++ b/mithril-common/src/entities/cardano_network.rs @@ -8,6 +8,7 @@ const MAINNET_MAGIC_ID: MagicId = 764824073; const TESTNET_MAGIC_ID: MagicId = 1097911063; const PREPROD_MAGIC_ID: MagicId = 1; const PREVIEW_MAGIC_ID: MagicId = 2; +const SANCHONET_MAGIC_ID: MagicId = 4; #[derive(Error, Debug)] pub enum CardanoNetworkError { @@ -40,6 +41,7 @@ impl CardanoNetwork { "testnet" => Ok(CardanoNetwork::TestNet(TESTNET_MAGIC_ID)), "preview" => Ok(CardanoNetwork::TestNet(PREVIEW_MAGIC_ID)), "preprod" => Ok(CardanoNetwork::TestNet(PREPROD_MAGIC_ID)), + "sanchonet" => Ok(CardanoNetwork::TestNet(SANCHONET_MAGIC_ID)), "private" => { if let Some(magic) = network_magic { Ok(CardanoNetwork::TestNet(magic)) @@ -83,6 +85,7 @@ impl Display for CardanoNetwork { TESTNET_MAGIC_ID => write!(f, "testnet"), PREVIEW_MAGIC_ID => write!(f, "preview"), PREPROD_MAGIC_ID => write!(f, "preprod"), + SANCHONET_MAGIC_ID => write!(f, "sanchonet"), _ => write!(f, "private"), }, } @@ -119,6 +122,14 @@ mod tests { CardanoNetwork::from_code("preprod".to_string(), Some(123)).unwrap(), CardanoNetwork::TestNet(PREPROD_MAGIC_ID) ); + assert_eq!( + CardanoNetwork::from_code("sanchonet".to_string(), None).unwrap(), + CardanoNetwork::TestNet(SANCHONET_MAGIC_ID) + ); + assert_eq!( + CardanoNetwork::from_code("sanchonet".to_string(), Some(123)).unwrap(), + CardanoNetwork::TestNet(SANCHONET_MAGIC_ID) + ); assert_eq!( CardanoNetwork::from_code("testnet".to_string(), None).unwrap(), CardanoNetwork::TestNet(TESTNET_MAGIC_ID) diff --git a/mithril-common/src/entities/cardano_transaction.rs b/mithril-common/src/entities/cardano_transaction.rs new file mode 100644 index 00000000000..dad91cd1309 --- /dev/null +++ b/mithril-common/src/entities/cardano_transaction.rs @@ -0,0 +1,69 @@ +use crate::crypto_helper::MKTreeNode; + +use super::ImmutableFileNumber; + +/// TransactionHash is the unique identifier of a cardano transaction. +pub type TransactionHash = String; + +/// BlockNumber is the block number of a cardano transaction. +pub type BlockNumber = u64; + +#[derive(Debug, PartialEq, Clone)] +/// Cardano transaction representation +pub struct CardanoTransaction { + /// Unique hash of the transaction + pub transaction_hash: TransactionHash, + + /// Block number of the transaction + pub block_number: BlockNumber, + + /// Immutable file number of the transaction + pub immutable_file_number: ImmutableFileNumber, +} + +impl CardanoTransaction { + /// CardanoTransaction factory + pub fn new( + hash: &str, + block_number: BlockNumber, + immutable_file_number: ImmutableFileNumber, + ) -> Self { + Self { + transaction_hash: hash.to_owned(), + block_number, + immutable_file_number, + } + } +} + +impl From for MKTreeNode { + fn from(other: CardanoTransaction) -> Self { + (&other).into() + } +} + +impl From<&CardanoTransaction> for MKTreeNode { + fn from(other: &CardanoTransaction) -> Self { + MKTreeNode::new(other.transaction_hash.as_bytes().to_vec()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_convert_cardano_transaction_to_merkle_tree_node() { + let transaction = CardanoTransaction { + transaction_hash: "tx-hash-123".to_string(), + block_number: 1, + immutable_file_number: 1, + }; + let computed_mktree_node: MKTreeNode = transaction.into(); + let expected_mk_tree_node = MKTreeNode::new("tx-hash-123".as_bytes().to_vec()); + let non_expected_mk_tree_node = MKTreeNode::new("tx-hash-456".as_bytes().to_vec()); + + assert_eq!(expected_mk_tree_node, computed_mktree_node); + assert_ne!(non_expected_mk_tree_node, computed_mktree_node); + } +} diff --git a/mithril-common/src/entities/cardano_transactions_commitment.rs b/mithril-common/src/entities/cardano_transactions_commitment.rs new file mode 100644 index 00000000000..307264e5bd9 --- /dev/null +++ b/mithril-common/src/entities/cardano_transactions_commitment.rs @@ -0,0 +1,69 @@ +use crate::signable_builder::Artifact; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; + +use super::Beacon; + +/// Commitment of a set of Cardano transactions +#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)] +pub struct CardanoTransactionsCommitment { + /// Hash of the Cardano transactions set + pub hash: String, + + /// Merkle root of the Cardano transactions set + pub merkle_root: String, + + /// Beacon of the Cardano transactions set + pub beacon: Beacon, +} + +impl CardanoTransactionsCommitment { + /// Creates a new [CardanoTransactionsCommitment] + pub fn new(merkle_root: String, beacon: Beacon) -> Self { + let mut cardano_transactions_commitment = Self { + merkle_root, + beacon, + hash: "".to_string(), + }; + cardano_transactions_commitment.hash = cardano_transactions_commitment.compute_hash(); + cardano_transactions_commitment + } + + /// Cardano transactions commitment hash computation + fn compute_hash(&self) -> String { + let mut hasher = Sha256::new(); + hasher.update(self.merkle_root.clone().as_bytes()); + hasher.update(self.beacon.compute_hash().as_bytes()); + + hex::encode(hasher.finalize()) + } +} + +#[typetag::serde] +impl Artifact for CardanoTransactionsCommitment { + fn get_id(&self) -> String { + self.hash.clone() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_cardano_transactuions_commitment_compute_hash() { + let hash_expected = "66a1d7aa3995e9a0dce15fae3f6b91640824ecd1f81991df5ce4ddff62b34df4"; + + assert_eq!( + hash_expected, + CardanoTransactionsCommitment::new("mk-root-123".to_string(), Beacon::default()) + .compute_hash() + ); + + assert_ne!( + hash_expected, + CardanoTransactionsCommitment::new("mk-root-456".to_string(), Beacon::default()) + .compute_hash() + ); + } +} diff --git a/mithril-common/src/entities/cardano_transactions_set_proof.rs b/mithril-common/src/entities/cardano_transactions_set_proof.rs new file mode 100644 index 00000000000..01c7fcf1d50 --- /dev/null +++ b/mithril-common/src/entities/cardano_transactions_set_proof.rs @@ -0,0 +1,132 @@ +use crate::crypto_helper::{MKProof, ProtocolMkProof}; +use crate::entities::TransactionHash; +use crate::messages::CardanoTransactionsSetProofMessagePart; +use crate::{StdError, StdResult}; + +/// A cryptographic proof of a set of Cardano transactions is included in the global Cardano transactions set +#[derive(Clone, Debug, PartialEq)] +pub struct CardanoTransactionsSetProof { + /// Hashes of the certified transactions + transactions_hashes: Vec, + + /// Proof of the transactions + transactions_proof: ProtocolMkProof, +} + +impl CardanoTransactionsSetProof { + /// CardanoTransactionsSetProof factory + pub fn new(transactions_hashes: Vec, transactions_proof: MKProof) -> Self { + Self { + transactions_hashes, + transactions_proof: ProtocolMkProof::new(transactions_proof), + } + } + + /// Return the hex encoded merkle root of this proof + pub fn merkle_root(&self) -> String { + self.transactions_proof.root().to_hex() + } + + /// Get the hashes of the transactions certified by this proof + pub fn transactions_hashes(&self) -> &[TransactionHash] { + &self.transactions_hashes + } + + /// Verify that transactions set proof is valid + pub fn verify(&self) -> StdResult<()> { + self.transactions_proof.verify()?; + self.transactions_proof.contains( + self.transactions_hashes + .iter() + .map(|h| h.to_owned().into()) + .collect::>() + .as_slice(), + )?; + + Ok(()) + } + + cfg_test_tools! { + /// Retrieve a dummy proof (for test only) + pub fn dummy() -> Self { + let transactions_hashes = vec![ + "tx-1".to_string(), + "tx-2".to_string(), + "tx-3".to_string(), + "tx-4".to_string(), + "tx-5".to_string(), + ]; + let proof = MKProof::from_leaves(&transactions_hashes).unwrap(); + + Self::new(transactions_hashes, proof) + } + } +} + +impl TryFrom for CardanoTransactionsSetProofMessagePart { + type Error = StdError; + + fn try_from(proof: CardanoTransactionsSetProof) -> Result { + Ok(Self { + transactions_hashes: proof.transactions_hashes, + proof: proof.transactions_proof.to_json_hex()?, + }) + } +} + +impl TryFrom for CardanoTransactionsSetProof { + type Error = StdError; + + fn try_from(proof: CardanoTransactionsSetProofMessagePart) -> Result { + Ok(Self { + transactions_hashes: proof.transactions_hashes, + transactions_proof: ProtocolMkProof::from_json_hex(&proof.proof)?, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_verify_where_all_hashes_are_contained_in_the_proof() { + let transaction_hashes = vec![ + "tx-1".to_string(), + "tx-2".to_string(), + "tx-3".to_string(), + "tx-4".to_string(), + "tx-5".to_string(), + ]; + let transaction_hashes_to_verify = &transaction_hashes[0..2]; + let transactions_proof = + MKProof::from_subset_of_leaves(&transaction_hashes, transaction_hashes_to_verify) + .unwrap(); + + let proof = CardanoTransactionsSetProof::new( + transaction_hashes_to_verify.to_vec(), + transactions_proof, + ); + proof.verify().expect("The proof should be valid"); + } + + #[test] + fn shouldnt_verify_where_at_least_one_hash_is_not_contained_in_the_proof() { + let transaction_hashes = vec![ + "tx-1".to_string(), + "tx-2".to_string(), + "tx-3".to_string(), + "tx-4".to_string(), + "tx-5".to_string(), + ]; + let transactions_proof = + MKProof::from_subset_of_leaves(&transaction_hashes, &transaction_hashes[0..2]).unwrap(); + let transaction_hashes_not_verified = &transaction_hashes[1..3]; + + let proof = CardanoTransactionsSetProof::new( + transaction_hashes_not_verified.to_vec(), + transactions_proof, + ); + proof.verify().expect_err("The proof should be invalid"); + } +} diff --git a/mithril-common/src/entities/certificate.rs b/mithril-common/src/entities/certificate.rs index aae31269193..225abe45491 100644 --- a/mithril-common/src/entities/certificate.rs +++ b/mithril-common/src/entities/certificate.rs @@ -279,9 +279,7 @@ mod tests { let mut protocol_message_modified = certificate.protocol_message.clone(); protocol_message_modified.set_message_part( ProtocolMessagePartKey::NextAggregateVerificationKey, - fake_keys::aggregate_verification_key()[2] - .try_into() - .unwrap(), + fake_keys::aggregate_verification_key()[2].into(), ); protocol_message_modified diff --git a/mithril-common/src/entities/mod.rs b/mithril-common/src/entities/mod.rs index f5e3df3785e..b5ae12d2ae5 100644 --- a/mithril-common/src/entities/mod.rs +++ b/mithril-common/src/entities/mod.rs @@ -2,6 +2,9 @@ mod beacon; mod cardano_network; +mod cardano_transaction; +mod cardano_transactions_commitment; +mod cardano_transactions_set_proof; mod certificate; mod certificate_metadata; mod certificate_pending; @@ -20,6 +23,9 @@ mod type_alias; pub use beacon::{Beacon, BeaconComparison, BeaconComparisonError}; pub use cardano_network::CardanoNetwork; +pub use cardano_transaction::{BlockNumber, CardanoTransaction, TransactionHash}; +pub use cardano_transactions_commitment::CardanoTransactionsCommitment; +pub use cardano_transactions_set_proof::CardanoTransactionsSetProof; pub use certificate::{Certificate, CertificateSignature}; pub use certificate_metadata::{CertificateMetadata, StakeDistributionParty}; pub use certificate_pending::CertificatePending; diff --git a/mithril-common/src/entities/protocol_message.rs b/mithril-common/src/entities/protocol_message.rs index 83c4a375f56..bae05d32a66 100644 --- a/mithril-common/src/entities/protocol_message.rs +++ b/mithril-common/src/entities/protocol_message.rs @@ -9,6 +9,10 @@ pub enum ProtocolMessagePartKey { #[serde(rename = "snapshot_digest")] SnapshotDigest, + /// The ProtocolMessage part key associated to the Cardano Transactions Merkle Root + #[serde(rename = "cardano_transactions_merkle_root")] + CardanoTransactionsMerkleRoot, + /// The ProtocolMessage part key associated to the Next epoch aggregate verification key /// The AVK that will be allowed to be used to sign during the next epoch /// aka AVK(n-1) @@ -21,6 +25,7 @@ impl Display for ProtocolMessagePartKey { match *self { Self::SnapshotDigest => write!(f, "snapshot_digest"), Self::NextAggregateVerificationKey => write!(f, "next_aggregate_verification_key"), + Self::CardanoTransactionsMerkleRoot => write!(f, "cardano_transactions_merkle_root"), } } } diff --git a/mithril-common/src/entities/signed_entity.rs b/mithril-common/src/entities/signed_entity.rs index 944bbea0a72..12842a4eeb6 100644 --- a/mithril-common/src/entities/signed_entity.rs +++ b/mithril-common/src/entities/signed_entity.rs @@ -1,8 +1,8 @@ -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use super::{Beacon, Epoch}; -use super::{MithrilStakeDistribution, SignedEntityType, Snapshot}; +use super::{CardanoTransactionsCommitment, MithrilStakeDistribution, SignedEntityType, Snapshot}; use crate::signable_builder::Artifact; -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_data; use chrono::{DateTime, Utc}; @@ -61,3 +61,20 @@ impl SignedEntity { } } } + +impl SignedEntity { + cfg_test_tools! { + /// Create a dummy [SignedEntity] for [CardanoTransactionsCommitment] entity + pub fn dummy() -> Self { + SignedEntity { + signed_entity_id: "snapshot-id-123".to_string(), + signed_entity_type: SignedEntityType::CardanoTransactions(Beacon::default()), + certificate_id: "certificate-hash-123".to_string(), + artifact: CardanoTransactionsCommitment::new("mkroot123".to_string(), Beacon::default()), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + } + } + } +} diff --git a/mithril-common/src/entities/signed_entity_type.rs b/mithril-common/src/entities/signed_entity_type.rs index 5b3b6ee7d35..b53dad29ec6 100644 --- a/mithril-common/src/entities/signed_entity_type.rs +++ b/mithril-common/src/entities/signed_entity_type.rs @@ -1,10 +1,8 @@ use crate::StdResult; +use anyhow::anyhow; use serde::{Deserialize, Serialize}; -use strum::{Display, EnumDiscriminants}; - -cfg_database! { - use crate::{sqlite::HydrationError}; -} +use std::time::Duration; +use strum::{Display, EnumDiscriminants, EnumString}; use super::{Beacon, Epoch}; @@ -17,6 +15,9 @@ const ENTITY_TYPE_CARDANO_STAKE_DISTRIBUTION: usize = 1; /// Database representation of the SignedEntityType::CardanoImmutableFilesFull value const ENTITY_TYPE_CARDANO_IMMUTABLE_FILES_FULL: usize = 2; +/// Database representation of the SignedEntityType::CardanoTransactions value +const ENTITY_TYPE_CARDANO_TRANSACTIONS: usize = 3; + /// The signed entity type that represents a type of data signed by the Mithril /// protocol Note: Each variant of this enum must be associated to an entry in /// the `signed_entity_type` table of the signer/aggregator nodes. The variant @@ -25,6 +26,7 @@ const ENTITY_TYPE_CARDANO_IMMUTABLE_FILES_FULL: usize = 2; /// variants. #[derive(Display, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, EnumDiscriminants)] #[strum(serialize_all = "PascalCase")] +#[strum_discriminants(derive(EnumString))] pub enum SignedEntityType { /// Mithril stake distribution MithrilStakeDistribution(Epoch), @@ -34,6 +36,9 @@ pub enum SignedEntityType { /// Full Cardano Immutable Files CardanoImmutableFilesFull(Beacon), + + /// Cardano Transactions + CardanoTransactions(Beacon), } impl SignedEntityType { @@ -45,59 +50,27 @@ impl SignedEntityType { /// Return the epoch from the intern beacon. pub fn get_epoch(&self) -> Epoch { match self { - Self::CardanoImmutableFilesFull(b) => b.epoch, + Self::CardanoImmutableFilesFull(b) | Self::CardanoTransactions(b) => b.epoch, Self::CardanoStakeDistribution(e) | Self::MithrilStakeDistribution(e) => *e, } } - cfg_database! { - /// Create an instance from data coming from the database - pub fn hydrate(signed_entity_type_id: usize, beacon_str: &str) -> Result { - let myself = match signed_entity_type_id { - ENTITY_TYPE_MITHRIL_STAKE_DISTRIBUTION => { - let epoch: Epoch = serde_json::from_str(beacon_str).map_err(|e| { - HydrationError::InvalidData(format!( - "Invalid Epoch JSON representation '{beacon_str}. Error: {e}'." - )) - })?; - Self::MithrilStakeDistribution(epoch) - } - ENTITY_TYPE_CARDANO_STAKE_DISTRIBUTION => { - let epoch: Epoch = serde_json::from_str(beacon_str).map_err(|e| { - HydrationError::InvalidData(format!( - "Invalid Epoch JSON representation '{beacon_str}. Error: {e}'." - )) - })?; - Self::CardanoStakeDistribution(epoch) - } - ENTITY_TYPE_CARDANO_IMMUTABLE_FILES_FULL => { - let beacon: Beacon = serde_json::from_str(beacon_str).map_err(|e| { - HydrationError::InvalidData(format!( - "Invalid Beacon JSON in open_message.beacon: '{beacon_str}'. Error: {e}" - )) - })?; - Self::CardanoImmutableFilesFull(beacon) - } - index => panic!("Invalid entity_type_id {index}."), - }; - - Ok(myself) - } - } - /// Get the database value from enum's instance pub fn index(&self) -> usize { match self { Self::MithrilStakeDistribution(_) => ENTITY_TYPE_MITHRIL_STAKE_DISTRIBUTION, Self::CardanoStakeDistribution(_) => ENTITY_TYPE_CARDANO_STAKE_DISTRIBUTION, Self::CardanoImmutableFilesFull(_) => ENTITY_TYPE_CARDANO_IMMUTABLE_FILES_FULL, + Self::CardanoTransactions(_) => ENTITY_TYPE_CARDANO_TRANSACTIONS, } } /// Return a JSON serialized value of the internal beacon pub fn get_json_beacon(&self) -> StdResult { let value = match self { - Self::CardanoImmutableFilesFull(value) => serde_json::to_string(value)?, + Self::CardanoImmutableFilesFull(value) | Self::CardanoTransactions(value) => { + serde_json::to_string(value)? + } Self::CardanoStakeDistribution(value) | Self::MithrilStakeDistribution(value) => { serde_json::to_string(value)? } @@ -105,6 +78,34 @@ impl SignedEntityType { Ok(value) } + + /// Return the associated open message timeout + pub fn get_open_message_timeout(&self) -> Option { + match self { + Self::MithrilStakeDistribution(_) | Self::CardanoImmutableFilesFull(_) => None, + Self::CardanoStakeDistribution(_) | Self::CardanoTransactions(_) => { + Some(Duration::from_secs(600)) + } + } + } + + /// Create a SignedEntityType from beacon and SignedEntityTypeDiscriminants + pub fn from_beacon(discriminant: &SignedEntityTypeDiscriminants, beacon: &Beacon) -> Self { + match discriminant { + SignedEntityTypeDiscriminants::MithrilStakeDistribution => { + Self::MithrilStakeDistribution(beacon.epoch) + } + SignedEntityTypeDiscriminants::CardanoStakeDistribution => { + Self::CardanoStakeDistribution(beacon.epoch) + } + SignedEntityTypeDiscriminants::CardanoImmutableFilesFull => { + Self::CardanoImmutableFilesFull(beacon.to_owned()) + } + SignedEntityTypeDiscriminants::CardanoTransactions => { + Self::CardanoTransactions(beacon.to_owned()) + } + } + } } impl SignedEntityTypeDiscriminants { @@ -114,6 +115,18 @@ impl SignedEntityTypeDiscriminants { Self::MithrilStakeDistribution => ENTITY_TYPE_MITHRIL_STAKE_DISTRIBUTION, Self::CardanoStakeDistribution => ENTITY_TYPE_CARDANO_STAKE_DISTRIBUTION, Self::CardanoImmutableFilesFull => ENTITY_TYPE_CARDANO_IMMUTABLE_FILES_FULL, + Self::CardanoTransactions => ENTITY_TYPE_CARDANO_TRANSACTIONS, + } + } + + /// Get the discriminant associated with the given id + pub fn from_id(signed_entity_type_id: usize) -> StdResult { + match signed_entity_type_id { + ENTITY_TYPE_MITHRIL_STAKE_DISTRIBUTION => Ok(Self::MithrilStakeDistribution), + ENTITY_TYPE_CARDANO_STAKE_DISTRIBUTION => Ok(Self::CardanoStakeDistribution), + ENTITY_TYPE_CARDANO_IMMUTABLE_FILES_FULL => Ok(Self::CardanoImmutableFilesFull), + ENTITY_TYPE_CARDANO_TRANSACTIONS => Ok(Self::CardanoTransactions), + index => Err(anyhow!("Invalid entity_type_id {index}.")), } } } diff --git a/mithril-common/src/era/adapters/builder.rs b/mithril-common/src/era/adapters/builder.rs index 855c1ebd3f9..d103e7f0e21 100644 --- a/mithril-common/src/era/adapters/builder.rs +++ b/mithril-common/src/era/adapters/builder.rs @@ -15,7 +15,7 @@ use crate::{ StdError, }; -/// Type of era reader adapaters available +/// Type of era reader adapters available #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum AdapterType { diff --git a/mithril-common/src/lib.rs b/mithril-common/src/lib.rs index 12fbb14f349..d5e81193ec5 100644 --- a/mithril-common/src/lib.rs +++ b/mithril-common/src/lib.rs @@ -1,20 +1,20 @@ #![warn(missing_docs)] +#![cfg_attr(docsrs, feature(doc_cfg))] //! Shared datatypes and traits used by Mithril rust projects //! //! Provide: -//! - A way to store data with the [store] types //! - [Digester][digesters] to compute mithril digest from a Cardano database //! - Helpers for the [Mithril STM](https://mithril.network/rust-doc/mithril_stm/index.html) //! lib with the [crypto_helper]. -//! - A [certificate chain] used to validate the Certificate Chain created by an aggregator +//! - [certificate chain][certificate_chain] used to validate the Certificate Chain created by an aggregator //! - The [entities] used by, and exchanged between, the aggregator, signers and client. -macro_rules! cfg_database { +macro_rules! cfg_fs { ($($item:item)*) => { $( - #[cfg(feature = "database")] - #[cfg_attr(docsrs, doc(cfg(feature = "database")))] + #[cfg(feature = "fs")] + #[cfg_attr(docsrs, doc(cfg(feature = "fs")))] $item )* } @@ -23,7 +23,7 @@ macro_rules! cfg_database { macro_rules! cfg_random { ($($item:item)*) => { $( - #[cfg(feature = "random")] + #[cfg(any(test, feature = "random"))] #[cfg_attr(docsrs, doc(cfg(feature = "random")))] $item )* @@ -33,7 +33,7 @@ macro_rules! cfg_random { macro_rules! cfg_test_tools { ($($item:item)*) => { $( - #[cfg(feature = "test_tools")] + #[cfg(any(test, feature = "test_tools"))] #[cfg_attr(docsrs, doc(cfg(feature = "test_tools")))] $item )* @@ -41,16 +41,9 @@ macro_rules! cfg_test_tools { } pub mod api_version; -#[cfg(feature = "fs")] -mod beacon_provider; - pub mod certificate_chain; pub mod chain_observer; pub mod crypto_helper; -#[cfg(feature = "database")] -pub mod database; -#[cfg(feature = "fs")] -pub mod digesters; pub mod entities; #[macro_use] pub mod era; @@ -58,16 +51,17 @@ pub mod messages; pub mod protocol; pub mod signable_builder; -#[cfg(feature = "database")] -pub mod sqlite; -#[cfg(feature = "database")] -pub mod store; +cfg_test_tools! { + pub mod test_utils; +} -#[cfg(feature = "test_tools")] -pub mod test_utils; +cfg_fs! { + mod beacon_provider; + pub mod digesters; + pub mod cardano_transaction_parser; -#[cfg(feature = "fs")] -pub use beacon_provider::{BeaconProvider, BeaconProviderImpl}; + pub use beacon_provider::{BeaconProvider, BeaconProviderImpl}; +} pub use entities::{CardanoNetwork, MagicId}; diff --git a/mithril-common/src/messages/cardano_transaction_commitment.rs b/mithril-common/src/messages/cardano_transaction_commitment.rs new file mode 100644 index 00000000000..dee92b8ac8b --- /dev/null +++ b/mithril-common/src/messages/cardano_transaction_commitment.rs @@ -0,0 +1,81 @@ +use chrono::DateTime; +use chrono::Utc; +use serde::{Deserialize, Serialize}; + +use crate::entities::Beacon; +#[cfg(any(test, feature = "test_tools"))] +use crate::test_utils::fake_data; + +/// Message structure of a Cardano Transactions commitment +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct CardanoTransactionCommitmentMessage { + /// Merkle root of the Cardano transactions commitment + pub merkle_root: String, + + /// Beacon of the Cardano transactions commitment + pub beacon: Beacon, + + /// Hash of the Cardano Transactions commitment + pub hash: String, + + /// Hash of the associated certificate + pub certificate_hash: String, + + /// DateTime of creation + pub created_at: DateTime, +} + +impl CardanoTransactionCommitmentMessage { + cfg_test_tools! { + /// Return a dummy test entity (test-only). + pub fn dummy() -> Self { + Self { + merkle_root: "mkroot-123".to_string(), + beacon: fake_data::beacon(), + hash: "hash-123".to_string(), + certificate_hash: "cert-hash-123".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn golden_message() -> CardanoTransactionCommitmentMessage { + CardanoTransactionCommitmentMessage { + merkle_root: "mkroot-123".to_string(), + beacon: fake_data::beacon(), + hash: "hash-123".to_string(), + certificate_hash: "certificate-hash-123".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + } + } + + // Test the retro compatibility with possible future upgrades. + #[test] + fn test_v1() { + let json = r#"{ + "merkle_root": "mkroot-123", + "beacon": { + "network": "testnet", + "epoch": 10, + "immutable_file_number": 100 + }, + "hash": "hash-123", + "certificate_hash": "certificate-hash-123", + "created_at": "2023-01-19T13:43:05.618857482Z" + }"#; + let message: CardanoTransactionCommitmentMessage = serde_json::from_str(json).expect( + "This JSON is expected to be succesfully parsed into a CardanoTransactionCommitmentMessage instance.", + ); + + assert_eq!(golden_message(), message); + } +} diff --git a/mithril-common/src/messages/cardano_transaction_commitment_list.rs b/mithril-common/src/messages/cardano_transaction_commitment_list.rs new file mode 100644 index 00000000000..9d9c273e486 --- /dev/null +++ b/mithril-common/src/messages/cardano_transaction_commitment_list.rs @@ -0,0 +1,86 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; + +use crate::entities::Beacon; +#[cfg(any(test, feature = "test_tools"))] +use crate::test_utils::fake_data; + +/// Message structure of a Cardano Transactions Commitments list +pub type CardanoTransactionCommitmentListMessage = Vec; + +/// Message structure of a Cardano Transactions Commitment list item +#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)] +pub struct CardanoTransactionCommitmentListItemMessage { + /// Merkle root of the Cardano transactions commitment + pub merkle_root: String, + + /// Beacon of the Cardano transactions commitment + pub beacon: Beacon, + + /// Hash of the Cardano Transactions commitment + pub hash: String, + + /// Hash of the associated certificate + pub certificate_hash: String, + + /// DateTime of creation + pub created_at: DateTime, +} + +impl CardanoTransactionCommitmentListItemMessage { + cfg_test_tools! { + /// Return a dummy test entity (test-only). + pub fn dummy() -> Self { + Self { + merkle_root: "mkroot-123".to_string(), + beacon: fake_data::beacon(), + hash: "hash-123".to_string(), + certificate_hash: "cert-hash-123".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + } + } + } +} + +#[cfg(test)] +mod tests { + use crate::test_utils::fake_data; + + use super::*; + + fn golden_message() -> CardanoTransactionCommitmentListMessage { + vec![CardanoTransactionCommitmentListItemMessage { + merkle_root: "mkroot-123".to_string(), + beacon: fake_data::beacon(), + hash: "hash-123".to_string(), + certificate_hash: "certificate-hash-123".to_string(), + created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") + .unwrap() + .with_timezone(&Utc), + }] + } + + // Test the retro compatibility with possible future upgrades. + #[test] + fn test_v1() { + let json = r#"[{ + "merkle_root": "mkroot-123", + "beacon": { + "network": "testnet", + "epoch": 10, + "immutable_file_number": 100 + }, + "hash": "hash-123", + "certificate_hash": "certificate-hash-123", + "created_at": "2023-01-19T13:43:05.618857482Z" + }]"#; + println!("message: {:?}", golden_message()); + + let message: CardanoTransactionCommitmentListMessage = serde_json::from_str(json).expect( + "This JSON is expected to be succesfully parsed into a CardanoTransactionCommitmentListMessage instance.", + ); + assert_eq!(golden_message(), message); + } +} diff --git a/mithril-common/src/messages/cardano_transactions_proof.rs b/mithril-common/src/messages/cardano_transactions_proof.rs new file mode 100644 index 00000000000..8d784fc8b3b --- /dev/null +++ b/mithril-common/src/messages/cardano_transactions_proof.rs @@ -0,0 +1,268 @@ +use crate::entities::{ + CardanoTransactionsSetProof, ProtocolMessage, ProtocolMessagePartKey, TransactionHash, +}; +use crate::messages::CardanoTransactionsSetProofMessagePart; +use crate::StdError; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +/// A cryptographic proof for a set of Cardano transactions +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct CardanoTransactionsProofsMessage { + /// Hash of the certificate that validate this proof merkle root + pub certificate_hash: String, + + /// Transactions that have been certified + pub certified_transactions: Vec, + + /// Transactions that could not be certified + pub non_certified_transactions: Vec, +} + +/// Set of transactions verified by [CardanoTransactionsProofsMessage::verify]. +/// +/// Can be used to reconstruct part of a [ProtocolMessage] in order to check that +/// it is indeed signed by a certificate. +#[derive(Debug, Clone, PartialEq)] +pub struct VerifiedCardanoTransactions { + certificate_hash: String, + merkle_root: String, + certified_transactions: Vec, +} + +impl VerifiedCardanoTransactions { + /// Hash of the certificate that signs this struct Merkle root. + pub fn certificate_hash(&self) -> &str { + &self.certificate_hash + } + + /// Hashes of the certified transactions + pub fn certified_transactions(&self) -> &[TransactionHash] { + &self.certified_transactions + } + + /// Fill the given [ProtocolMessage] with the data associated with this + /// verified transactions set. + pub fn fill_protocol_message(&self, message: &mut ProtocolMessage) { + message.set_message_part( + ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, + self.merkle_root.clone(), + ); + } +} + +#[derive(Error, Debug)] +pub enum VerifyCardanoTransactionsProofsError { + /// The verification of an individual [CardanoTransactionsSetProofMessagePart] failed. + #[error("Invalid set proof for transactions hashes: {transactions_hashes:?}")] + InvalidSetProof { + transactions_hashes: Vec, + source: StdError, + }, + + /// No certified transactions set proof to verify + #[error("There's no certified transaction to verify")] + NoCertifiedTransaction, + + /// Not all certified transactions set proof have the same merkle root. + /// + /// This is problematic because all the set proof should be generated from the same + /// merkle tree which root is signed in the [crate::entities::Certificate][certificate]. + #[error("All certified transactions set proofs must share the same Merkle root")] + NonMatchingMerkleRoot, + + /// An individual [CardanoTransactionsSetProofMessagePart] could not be converted to a + /// [CardanoTransactionsProofsMessage] for verification. + #[error("Malformed data or unknown Cardano Set Proof format")] + MalformedData(#[source] StdError), +} + +impl CardanoTransactionsProofsMessage { + /// Create a new `CardanoTransactionsProofsMessage` + pub fn new( + certificate_hash: &str, + certified_transactions: Vec, + non_certified_transactions: Vec, + ) -> Self { + Self { + certificate_hash: certificate_hash.to_string(), + certified_transactions, + non_certified_transactions, + } + } + + /// Verify that all the certified transactions proofs are valid + /// + /// The following checks will be executed: + /// 1 - Check that each Merkle proof is valid + /// 2 - Check that all proofs share the same Merkle root + /// 3 - Assert that there's at least one certified transaction + /// + /// If every check is okay, the hex encoded Merkle root of the proof will be returned. + pub fn verify( + &self, + ) -> Result { + let mut merkle_root = None; + + for certified_transaction in &self.certified_transactions { + let certified_transaction: CardanoTransactionsSetProof = certified_transaction + .clone() + .try_into() + .map_err(VerifyCardanoTransactionsProofsError::MalformedData)?; + certified_transaction.verify().map_err(|e| { + VerifyCardanoTransactionsProofsError::InvalidSetProof { + transactions_hashes: certified_transaction.transactions_hashes().to_vec(), + source: e, + } + })?; + + let tx_merkle_root = Some(certified_transaction.merkle_root()); + + if merkle_root.is_none() { + merkle_root = tx_merkle_root; + } else if merkle_root != tx_merkle_root { + return Err(VerifyCardanoTransactionsProofsError::NonMatchingMerkleRoot); + } + } + + Ok(VerifiedCardanoTransactions { + certificate_hash: self.certificate_hash.clone(), + merkle_root: merkle_root + .ok_or(VerifyCardanoTransactionsProofsError::NoCertifiedTransaction)?, + certified_transactions: self + .certified_transactions + .iter() + .flat_map(|c| c.transactions_hashes.clone()) + .collect(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::crypto_helper::MKProof; + + #[test] + fn verify_malformed_proofs_fail() { + let txs_proofs = CardanoTransactionsProofsMessage::new( + "whatever", + vec![CardanoTransactionsSetProofMessagePart { + transactions_hashes: vec![], + proof: "invalid".to_string(), + }], + vec![], + ); + + let error = txs_proofs + .verify() + .expect_err("Malformed txs proofs should fail to verify itself"); + assert!( + matches!( + error, + VerifyCardanoTransactionsProofsError::MalformedData(_) + ), + "Expected 'MalformedData' error but got '{:?}'", + error + ); + } + + #[test] + fn verify_no_certified_transaction_fail() { + let txs_proofs = CardanoTransactionsProofsMessage::new("whatever", vec![], vec![]); + + let error = txs_proofs + .verify() + .expect_err("Proofs without certified transactions should fail to verify itself"); + assert!( + matches!( + error, + VerifyCardanoTransactionsProofsError::NoCertifiedTransaction + ), + "Expected 'NoCertifiedTransactions' error but got '{:?}'", + error + ); + } + + #[test] + fn verify_valid_proofs() { + let set_proof = CardanoTransactionsSetProof::dummy(); + let expected = VerifiedCardanoTransactions { + certificate_hash: "whatever".to_string(), + merkle_root: set_proof.merkle_root(), + certified_transactions: set_proof.transactions_hashes().to_vec(), + }; + let txs_proofs = CardanoTransactionsProofsMessage::new( + "whatever", + vec![set_proof.try_into().unwrap()], + vec![], + ); + + let verified_txs = txs_proofs + .verify() + .expect("Valid txs proofs should verify itself"); + + assert_eq!(expected, verified_txs); + } + + #[test] + fn verify_invalid_proofs() { + let set_proof = CardanoTransactionsSetProof::new( + vec!["invalid1".to_string()], + MKProof::from_leaves(&["invalid2"]).unwrap(), + ); + let txs_proofs = CardanoTransactionsProofsMessage::new( + "whatever", + vec![set_proof.try_into().unwrap()], + vec![], + ); + + let error = txs_proofs + .verify() + .expect_err("Invalid txs proofs should fail to verify itself"); + + assert!( + matches!( + error, + VerifyCardanoTransactionsProofsError::InvalidSetProof { .. }, + ), + "Expected 'InvalidSetProof' error but got '{:?}'", + error + ); + } + + #[test] + fn verify_valid_proof_with_different_merkle_root_fail() { + let set_proofs = vec![ + CardanoTransactionsSetProof::new( + vec!["tx-1".to_string()], + MKProof::from_leaves(&["tx-1"]).unwrap(), + ), + CardanoTransactionsSetProof::new( + vec!["tx-2".to_string()], + MKProof::from_leaves(&["tx-2"]).unwrap(), + ), + ]; + let txs_proofs = CardanoTransactionsProofsMessage::new( + "whatever", + set_proofs + .into_iter() + .map(|p| p.try_into().unwrap()) + .collect(), + vec![], + ); + + let error = txs_proofs + .verify() + .expect_err("Txs proofs with non matching merkle root should fail to verify itself"); + + assert!( + matches!( + error, + VerifyCardanoTransactionsProofsError::NonMatchingMerkleRoot { .. }, + ), + "Expected 'NonMatchingMerkleRoot' error but got '{:?}'", + error + ); + } +} diff --git a/mithril-common/src/messages/certificate.rs b/mithril-common/src/messages/certificate.rs index 9701564290f..d03a7e220ce 100644 --- a/mithril-common/src/messages/certificate.rs +++ b/mithril-common/src/messages/certificate.rs @@ -2,13 +2,14 @@ use anyhow::Context; use serde::{Deserialize, Serialize}; use std::fmt::{Debug, Formatter}; -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use crate::entities::ProtocolMessagePartKey; use crate::entities::{ Beacon, Certificate, CertificateMetadata, CertificateSignature, ProtocolMessage, }; use crate::messages::CertificateMetadataMessagePart; -#[cfg(feature = "test_tools")] + +#[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_keys; use crate::StdError; diff --git a/mithril-common/src/messages/message_parts/cardano_transactions_set_proof.rs b/mithril-common/src/messages/message_parts/cardano_transactions_set_proof.rs new file mode 100644 index 00000000000..4a97eafa6ad --- /dev/null +++ b/mithril-common/src/messages/message_parts/cardano_transactions_set_proof.rs @@ -0,0 +1,21 @@ +use crate::entities::{HexEncodedKey, TransactionHash}; +use serde::{Deserialize, Serialize}; + +/// A cryptographic proof of a set of Cardano transactions is included in the global Cardano transactions set +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct CardanoTransactionsSetProofMessagePart { + /// Hashes of the certified transactions + pub transactions_hashes: Vec, + + /// Proof of the transactions + pub proof: HexEncodedKey, +} + +impl CardanoTransactionsSetProofMessagePart { + cfg_test_tools! { + /// Retrieve a dummy proof (for test only) + pub fn dummy() -> Self { + crate::entities::CardanoTransactionsSetProof::dummy().try_into().unwrap() + } + } +} diff --git a/mithril-common/src/messages/message_parts/mod.rs b/mithril-common/src/messages/message_parts/mod.rs index 8ee0127ae7a..2e34dabb857 100644 --- a/mithril-common/src/messages/message_parts/mod.rs +++ b/mithril-common/src/messages/message_parts/mod.rs @@ -1,5 +1,7 @@ +mod cardano_transactions_set_proof; mod certificate_metadata; mod signer; +pub use cardano_transactions_set_proof::CardanoTransactionsSetProofMessagePart; pub use certificate_metadata::CertificateMetadataMessagePart; pub use signer::{SignerMessagePart, SignerWithStakeMessagePart}; diff --git a/mithril-common/src/messages/message_parts/signer.rs b/mithril-common/src/messages/message_parts/signer.rs index 35a012a2450..43a466f6987 100644 --- a/mithril-common/src/messages/message_parts/signer.rs +++ b/mithril-common/src/messages/message_parts/signer.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_keys; use crate::{ crypto_helper::{KESPeriod, ProtocolOpCert, ProtocolSignerVerificationKeySignature}, diff --git a/mithril-common/src/messages/mithril_stake_distribution.rs b/mithril-common/src/messages/mithril_stake_distribution.rs index e78836d1919..f616f5e840e 100644 --- a/mithril-common/src/messages/mithril_stake_distribution.rs +++ b/mithril-common/src/messages/mithril_stake_distribution.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::entities::Epoch; use crate::entities::ProtocolParameters; -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_data; use super::SignerWithStakeMessagePart; diff --git a/mithril-common/src/messages/mod.rs b/mithril-common/src/messages/mod.rs index 214b18453f6..b702c5f3264 100644 --- a/mithril-common/src/messages/mod.rs +++ b/mithril-common/src/messages/mod.rs @@ -1,5 +1,8 @@ //! Messages module //! This module aims at providing shared structures for API communications. +mod cardano_transaction_commitment; +mod cardano_transaction_commitment_list; +mod cardano_transactions_proof; mod certificate; mod certificate_list; mod certificate_pending; @@ -14,6 +17,13 @@ mod snapshot; mod snapshot_download; mod snapshot_list; +pub use cardano_transaction_commitment::CardanoTransactionCommitmentMessage; +pub use cardano_transaction_commitment_list::{ + CardanoTransactionCommitmentListItemMessage, CardanoTransactionCommitmentListMessage, +}; +pub use cardano_transactions_proof::{ + CardanoTransactionsProofsMessage, VerifiedCardanoTransactions, +}; pub use certificate::CertificateMessage; pub use certificate_list::{ CertificateListItemMessage, CertificateListItemMessageMetadata, CertificateListMessage, diff --git a/mithril-common/src/messages/register_signature.rs b/mithril-common/src/messages/register_signature.rs index 4c066d92d97..7d18722d9f0 100644 --- a/mithril-common/src/messages/register_signature.rs +++ b/mithril-common/src/messages/register_signature.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use std::fmt::{Debug, Formatter}; use crate::entities::{HexEncodedSingleSignature, LotteryIndex, PartyId, SignedEntityType}; -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_keys; era_deprecate!("make signed_entity_type of RegisterSignatureMessage not optional"); diff --git a/mithril-common/src/messages/register_signer.rs b/mithril-common/src/messages/register_signer.rs index c6d8de51d4e..d1aebe132f7 100644 --- a/mithril-common/src/messages/register_signer.rs +++ b/mithril-common/src/messages/register_signer.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use std::fmt::{Debug, Formatter}; -#[cfg(feature = "test_tools")] +#[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_keys; use crate::{ crypto_helper::KESPeriod, diff --git a/mithril-common/src/signable_builder/cardano_transactions.rs b/mithril-common/src/signable_builder/cardano_transactions.rs new file mode 100644 index 00000000000..35d2655281e --- /dev/null +++ b/mithril-common/src/signable_builder/cardano_transactions.rs @@ -0,0 +1,219 @@ +use std::{ + path::{Path, PathBuf}, + sync::Arc, +}; + +use anyhow::Context; +use async_trait::async_trait; +use slog::{debug, Logger}; + +use crate::{ + cardano_transaction_parser::TransactionParser, + crypto_helper::{MKTree, MKTreeNode, MKTreeStore}, + entities::{Beacon, CardanoTransaction, ProtocolMessage, ProtocolMessagePartKey}, + signable_builder::SignableBuilder, + StdResult, +}; + +#[cfg(test)] +use mockall::automock; + +/// Cardano transactions store +#[cfg_attr(test, automock)] +#[async_trait] +pub trait TransactionStore: Send + Sync { + /// Store list of transactions + async fn store_transactions(&self, transactions: &[CardanoTransaction]) -> StdResult<()>; +} + +/// A [CardanoTransactionsSignableBuilder] builder +pub struct CardanoTransactionsSignableBuilder { + transaction_parser: Arc, + transaction_store: Arc, + logger: Logger, + dirpath: PathBuf, +} + +impl CardanoTransactionsSignableBuilder { + /// Constructor + pub fn new( + transaction_parser: Arc, + transaction_store: Arc, + dirpath: &Path, + logger: Logger, + ) -> Self { + Self { + transaction_parser, + transaction_store, + logger, + dirpath: dirpath.to_owned(), + } + } + + fn compute_merkle_root(&self, transactions: &[CardanoTransaction]) -> StdResult { + let store = MKTreeStore::default(); + let leaves = transactions.iter().map(|tx| tx.into()).collect::>(); + let mk_tree = MKTree::new(&leaves, &store) + .with_context(|| "CardanoTransactionsSignableBuilder failed to compute MKTree")?; + let mk_root = mk_tree + .compute_root() + .with_context(|| "CardanoTransactionsSignableBuilder failed to compute MKTree root")?; + + Ok(mk_root) + } +} + +#[async_trait] +impl SignableBuilder for CardanoTransactionsSignableBuilder { + // TODO: return a protocol message computed from the transactions when it's ready to be implemented + async fn compute_protocol_message(&self, beacon: Beacon) -> StdResult { + debug!( + self.logger, + "Compute protocol message for CardanoTransactions at beacon: {beacon}" + ); + + let transactions = self + .transaction_parser + .parse(&self.dirpath, &beacon) + .await?; + debug!( + self.logger, + "Retrieved {} Cardano transactions at beacon: {beacon}", + transactions.len() + ); + + let transaction_chunk_size = 100; + for transactions_in_chunk in transactions.chunks(transaction_chunk_size) { + self.transaction_store + .store_transactions(transactions_in_chunk) + .await?; + } + + let mk_root = self.compute_merkle_root(&transactions)?; + + let mut protocol_message = ProtocolMessage::new(); + protocol_message.set_message_part( + ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, + mk_root.to_hex(), + ); + + Ok(protocol_message) + } +} + +#[cfg(test)] +mod tests { + use crate::cardano_transaction_parser::DumbTransactionParser; + use crate::signable_builder::MockTransactionStore; + + use super::*; + use slog::Drain; + + fn create_logger() -> slog::Logger { + let decorator = slog_term::PlainDecorator::new(slog_term::TestStdoutWriter); + let drain = slog_term::CompactFormat::new(decorator).build().fuse(); + let drain = slog_async::Async::new(drain).build().fuse(); + slog::Logger::root(Arc::new(drain), slog::o!()) + } + + #[tokio::test] + async fn test_compute_merkle_root() { + let transaction_1 = CardanoTransaction::new("tx-hash-123", 1, 1); + let transaction_2 = CardanoTransaction::new("tx-hash-456", 2, 1); + let transaction_3 = CardanoTransaction::new("tx-hash-789", 3, 1); + let transaction_4 = CardanoTransaction::new("tx-hash-abc", 4, 1); + + let transactions_set_reference = vec![ + transaction_1.clone(), + transaction_2.clone(), + transaction_3.clone(), + ]; + let cardano_transaction_signable_builder = CardanoTransactionsSignableBuilder::new( + Arc::new(DumbTransactionParser::new( + transactions_set_reference.clone(), + )), + Arc::new(MockTransactionStore::new()), + Path::new("/tmp"), + create_logger(), + ); + + let merkle_root_reference = cardano_transaction_signable_builder + .compute_merkle_root(&transactions_set_reference) + .unwrap(); + { + let transactions_set = vec![transaction_1.clone()]; + let mk_root = cardano_transaction_signable_builder + .compute_merkle_root(&transactions_set) + .unwrap(); + assert_ne!(merkle_root_reference, mk_root); + } + { + let transactions_set = vec![transaction_1.clone(), transaction_2.clone()]; + let mk_root = cardano_transaction_signable_builder + .compute_merkle_root(&transactions_set) + .unwrap(); + assert_ne!(merkle_root_reference, mk_root); + } + { + let transactions_set = vec![ + transaction_1.clone(), + transaction_2.clone(), + transaction_3.clone(), + transaction_4.clone(), + ]; + let mk_root = cardano_transaction_signable_builder + .compute_merkle_root(&transactions_set) + .unwrap(); + assert_ne!(merkle_root_reference, mk_root); + } + + { + // Transactions in a different order returns a different merkle root. + let transactions_set = vec![ + transaction_1.clone(), + transaction_3.clone(), + transaction_2.clone(), + ]; + let mk_root = cardano_transaction_signable_builder + .compute_merkle_root(&transactions_set) + .unwrap(); + assert_ne!(merkle_root_reference, mk_root); + } + } + + #[tokio::test] + async fn test_compute_signable() { + let beacon = Beacon::default(); + let transactions = vec![ + CardanoTransaction::new("tx-hash-123", 1, 1), + CardanoTransaction::new("tx-hash-456", 2, 1), + CardanoTransaction::new("tx-hash-789", 3, 1), + ]; + let transaction_parser = Arc::new(DumbTransactionParser::new(transactions.clone())); + let mut mock_transaction_store = MockTransactionStore::new(); + mock_transaction_store + .expect_store_transactions() + .times(1) + .returning(|_| Ok(())); + let transaction_store = Arc::new(mock_transaction_store); + let cardano_transactions_signable_builder = CardanoTransactionsSignableBuilder::new( + transaction_parser, + transaction_store, + Path::new("/tmp"), + create_logger(), + ); + let mk_root = cardano_transactions_signable_builder + .compute_merkle_root(&transactions) + .unwrap(); + let signable = cardano_transactions_signable_builder + .compute_protocol_message(beacon.clone()) + .await + .unwrap(); + let mut signable_expected = ProtocolMessage::new(); + signable_expected.set_message_part( + ProtocolMessagePartKey::CardanoTransactionsMerkleRoot, + mk_root.to_hex(), + ); + assert_eq!(signable_expected, signable); + } +} diff --git a/mithril-common/src/signable_builder/mod.rs b/mithril-common/src/signable_builder/mod.rs index 1593f612bfb..25bc0e808c3 100644 --- a/mithril-common/src/signable_builder/mod.rs +++ b/mithril-common/src/signable_builder/mod.rs @@ -1,13 +1,20 @@ //! The module used for building signables -#[cfg(feature = "fs")] -mod cardano_immutable_full_signable_builder; mod interface; mod mithril_stake_distribution; mod signable_builder_service; -#[cfg(feature = "fs")] -pub use cardano_immutable_full_signable_builder::*; pub use interface::*; pub use mithril_stake_distribution::*; pub use signable_builder_service::*; + +cfg_fs! { + mod cardano_immutable_full_signable_builder; + mod cardano_transactions; + + pub use cardano_immutable_full_signable_builder::*; + pub use cardano_transactions::*; +} + +#[cfg(all(test, feature = "fs"))] +pub use cardano_transactions::MockTransactionStore; diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 2ed5505ad53..3cae8541c14 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -26,6 +26,7 @@ pub trait SignableBuilderService: Send + Sync { pub struct MithrilSignableBuilderService { mithril_stake_distribution_builder: Arc>, immutable_signable_builder: Arc>, + cardano_transactions_signable_builder: Arc>, } impl MithrilSignableBuilderService { @@ -33,10 +34,12 @@ impl MithrilSignableBuilderService { pub fn new( mithril_stake_distribution_builder: Arc>, immutable_signable_builder: Arc>, + cardano_transactions_signable_builder: Arc>, ) -> Self { Self { mithril_stake_distribution_builder, immutable_signable_builder, + cardano_transactions_signable_builder, } } } @@ -63,6 +66,13 @@ impl SignableBuilderService for MithrilSignableBuilderService { "Signable builder service can not compute protocol message with beacon: '{beacon}'" ))?, SignedEntityType::CardanoStakeDistribution(_) => todo!(), + SignedEntityType::CardanoTransactions(beacon) => self + .cardano_transactions_signable_builder + .compute_protocol_message(beacon.clone()) + .await + .with_context(|| format!( + "Signable builder service can not compute protocol message with beacon: '{beacon}'" + ))?, }; Ok(protocol_message) @@ -107,10 +117,12 @@ mod tests { let mock_cardano_immutable_files_full_signable_builder = MockSignableBuilderImpl::::new(); + let mock_cardano_transactions_signable_builder = MockSignableBuilderImpl::::new(); let signable_builder_service = MithrilSignableBuilderService::new( Arc::new(mock_mithril_stake_distribution_signable_builder), Arc::new(mock_cardano_immutable_files_full_signable_builder), + Arc::new(mock_cardano_transactions_signable_builder), ); let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1)); @@ -133,10 +145,12 @@ mod tests { .expect_compute_protocol_message() .once() .return_once(move |_| Ok(protocol_message_clone)); + let mock_cardano_transactions_signable_builder = MockSignableBuilderImpl::::new(); let signable_builder_service = MithrilSignableBuilderService::new( Arc::new(mock_mithril_stake_distribution_signable_builder), Arc::new(mock_cardano_immutable_files_full_signable_builder), + Arc::new(mock_cardano_transactions_signable_builder), ); let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(Beacon::default()); @@ -145,4 +159,33 @@ mod tests { .await .unwrap(); } + + #[tokio::test] + async fn build_transactions_signable_when_given_cardano_transactions_entity_type() { + let protocol_message = ProtocolMessage::new(); + let protocol_message_clone = protocol_message.clone(); + let mock_mithril_stake_distribution_signable_builder = + MockSignableBuilderImpl::::new(); + + let mock_cardano_immutable_files_full_signable_builder = + MockSignableBuilderImpl::::new(); + let mut mock_cardano_transactions_signable_builder = + MockSignableBuilderImpl::::new(); + mock_cardano_transactions_signable_builder + .expect_compute_protocol_message() + .once() + .return_once(move |_| Ok(protocol_message_clone)); + + let signable_builder_service = MithrilSignableBuilderService::new( + Arc::new(mock_mithril_stake_distribution_signable_builder), + Arc::new(mock_cardano_immutable_files_full_signable_builder), + Arc::new(mock_cardano_transactions_signable_builder), + ); + + let signed_entity_type = SignedEntityType::CardanoTransactions(Beacon::default()); + signable_builder_service + .compute_protocol_message(signed_entity_type) + .await + .unwrap(); + } } diff --git a/mithril-common/src/test_utils/apispec.rs b/mithril-common/src/test_utils/apispec.rs index bde09e35e78..b370b1f7e4f 100644 --- a/mithril-common/src/test_utils/apispec.rs +++ b/mithril-common/src/test_utils/apispec.rs @@ -1,10 +1,10 @@ //! Tools to helps validate conformity to an OpenAPI specification use glob::glob; -use http::response::Response; use jsonschema::JSONSchema; use serde::Serialize; use serde_json::{json, Value, Value::Null}; +use warp::http::Response; use warp::hyper::body::Bytes; use crate::era::SupportedEra; @@ -190,8 +190,8 @@ impl<'a> APISpec<'a> { #[cfg(test)] mod tests { - use http::StatusCode; use warp::http::Method; + use warp::http::StatusCode; use super::*; use crate::entities; diff --git a/mithril-common/src/test_utils/fake_data.rs b/mithril-common/src/test_utils/fake_data.rs index 92603e5461a..b12989e82bd 100644 --- a/mithril-common/src/test_utils/fake_data.rs +++ b/mithril-common/src/test_utils/fake_data.rs @@ -218,3 +218,18 @@ pub fn mithril_stake_distributions(total: u64) -> Vec>() } + +/// Fake Cardano Transactions +pub fn cardano_transactions_commitment(total: u64) -> Vec { + (1..total + 1) + .map(|idx| { + entities::CardanoTransactionsCommitment::new( + format!("merkleroot-{idx}"), + entities::Beacon { + immutable_file_number: idx, + ..beacon() + }, + ) + }) + .collect() +} diff --git a/mithril-common/src/test_utils/mod.rs b/mithril-common/src/test_utils/mod.rs index 19718da6429..ef56e643f64 100644 --- a/mithril-common/src/test_utils/mod.rs +++ b/mithril-common/src/test_utils/mod.rs @@ -7,6 +7,7 @@ //! #[cfg(feature = "apispec")] +#[cfg_attr(docsrs, doc(cfg(feature = "apispec")))] pub mod apispec; pub mod fake_data; @@ -16,6 +17,7 @@ mod fixture_builder; mod mithril_fixture; #[cfg(feature = "test_http_server")] +#[cfg_attr(docsrs, doc(cfg(feature = "test_http_server")))] pub mod test_http_server; pub use fixture_builder::{MithrilFixtureBuilder, StakeDistributionGenerationMethod}; diff --git a/mithril-explorer/Makefile b/mithril-explorer/Makefile index d0c96466d96..b9f2f6d09ad 100644 --- a/mithril-explorer/Makefile +++ b/mithril-explorer/Makefile @@ -1,12 +1,12 @@ .PHONY: clean install build dev test watch-test lint upgrade -yarn.lock: - yarn install +package-lock.json: + npm install -install: yarn.lock +install: package-lock.json -build: yarn.lock - yarn && yarn run build +build: package-lock.json + npm run build # Fix to allow refresh & direct linking to the navigation page on static hosting such as Github Pages # this is because the nextJs router is only active for the home page at start. # A 'cleaner' way to do that must exist. @@ -15,32 +15,31 @@ build: yarn.lock cp out/registrations.txt out/registrations/index.txt serve: build - yarn run start + npm run start -dev: +dev: build @echo "Serving dev build at: http://localhost:3000/explorer" - yarn run dev + npm run dev -test: yarn.lock - yarn run test:ci +test: package-lock.json + npm run test:ci -watch-test: yarn.lock - yarn run test +watch-test: package-lock.json + npm run test lint: - yarn run lint - yarn run pretty:check + npm run lint + npm run pretty:check format: - yarn run pretty:write + npm run pretty:write clean: rm -rf build rm package-lock.json || true - rm yarn.lock || true upgrade: clean install - yarn upgrade \ + npm install \ @popperjs/core@latest \ @reduxjs/toolkit@latest \ bootstrap@latest \ diff --git a/mithril-explorer/README.md b/mithril-explorer/README.md index 31f7cc90ddd..1bf8f35b9a4 100644 --- a/mithril-explorer/README.md +++ b/mithril-explorer/README.md @@ -12,7 +12,13 @@ Install [node.js](https://nodejs.org/en/) && (yarn)[https://yarnpkg.com/getting- ## Getting Started -First, run the development server: +First, build the `mithril-client-wasm` package: + +```bash +make -C ../mithril-client-wasm build +``` + +Then, run the development server: ```bash make dev diff --git a/mithril-explorer/next.config.js b/mithril-explorer/next.config.js index 8bedeb76c9f..8faf8f6599a 100644 --- a/mithril-explorer/next.config.js +++ b/mithril-explorer/next.config.js @@ -7,6 +7,10 @@ const nextConfig = { images: { unoptimized: true, }, + webpack: (config) => { + config.experiments = { layers: true, asyncWebAssembly: true }; + return config; + }, }; module.exports = nextConfig; diff --git a/mithril-explorer/package-lock.json b/mithril-explorer/package-lock.json new file mode 100644 index 00000000000..c8e34225c53 --- /dev/null +++ b/mithril-explorer/package-lock.json @@ -0,0 +1,7700 @@ +{ + "name": "mithril-explorer", + "version": "0.4.11", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mithril-explorer", + "version": "0.4.11", + "dependencies": { + "@mithril-dev/mithril-client-wasm": "file:../mithril-client-wasm/pkg", + "@popperjs/core": "^2.11.8", + "@reduxjs/toolkit": "^2.1.0", + "bootstrap": "^5.3.2", + "bootstrap-icons": "^1.11.3", + "chart.js": "^4.4.1", + "next": "^14.1.0", + "react": "^18.2.0", + "react-bootstrap": "^2.10.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "react-redux": "^9.1.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.4.0", + "@testing-library/react": "^14.2.0", + "eslint": "^8.56.0", + "eslint-config-next": "^14.1.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "next-router-mock": "^0.9.11", + "prettier": "^3.2.4", + "prettier-eslint": "^16.3.0" + } + }, + "../mithril-client-wasm/pkg": { + "name": "mithril-client-wasm", + "version": "0.1.8", + "license": "Apache-2.0" + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.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": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/@mithril-dev/mithril-client-wasm": { + "resolved": "../mithril-client-wasm/pkg", + "link": true + }, + "node_modules/@next/env": { + "version": "14.1.0", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.1.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.1.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.1", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/ssr/node_modules/@swc/helpers": { + "version": "0.5.3", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.1.0.tgz", + "integrity": "sha512-nfJ/b4ZhzUevQ1ZPKjlDL6CMYxO4o7ZL7OSsvSOxzT/EN11LsBDgTqP7aedHtBrFSVoK7oTP1SbMWUwGb30NLg==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.15", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.6.6", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "license": "MIT", + "peerDependencies": { + "react": ">=16.14.0" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.0.tgz", + "integrity": "sha512-GgGT3OR8qhIjk2SBMy51AYDWoMnAyR/cwjZO4SttuBmIQ9wWy9QmVOeaSbgT5Bm0J6qLBaf4+dsJWfisvafoaA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.3.2", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.2.0.tgz", + "integrity": "sha512-7uBnPHyOG6nDGCzv8SLeJbSa33ZoYw7swYpSLIgJvBALdq7l9zPNk33om4USrxy1lKTxXaVfufzLmq83WNfWIw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.13", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.48", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/@types/warning": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.20.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.20.0", + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/typescript-estree": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.20.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.20.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/visitor-keys": "6.20.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.20.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/bootstrap-icons": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", + "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ] + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001581", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chart.js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz", + "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.651", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.0.tgz", + "integrity": "sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.1.0", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.0.3", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.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": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz", + "integrity": "sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==", + "dependencies": { + "@next/env": "14.1.0", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.1.0", + "@next/swc-darwin-x64": "14.1.0", + "@next/swc-linux-arm64-gnu": "14.1.0", + "@next/swc-linux-arm64-musl": "14.1.0", + "@next/swc-linux-x64-gnu": "14.1.0", + "@next/swc-linux-x64-musl": "14.1.0", + "@next/swc-win32-arm64-msvc": "14.1.0", + "@next/swc-win32-ia32-msvc": "14.1.0", + "@next/swc-win32-x64-msvc": "14.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-router-mock": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.9.11.tgz", + "integrity": "sha512-3w7DdXDtjsBbPvHk3kBtmzyvn5BwRh133JM4G3gdjqt8zBzs08dvdU6EEPMZIiQv3mgxZwp7nFKGYEmUnMV/rQ==", + "dev": true, + "peerDependencies": { + "next": ">=10.0.0", + "react": ">=17.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", + "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-eslint": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", + "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + }, + "engines": { + "node": ">=16.10.0" + }, + "peerDependencies": { + "prettier-plugin-svelte": "^3.0.0", + "svelte-eslint-parser": "*" + }, + "peerDependenciesMeta": { + "prettier-plugin-svelte": { + "optional": true + }, + "svelte-eslint-parser": { + "optional": true + } + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-bootstrap": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.0.tgz", + "integrity": "sha512-87gRP69VAfeU2yKgp8RI3HvzhPNrnYIV2QNranYXataz3ef+k7OhvKGGdxQLQfUsQ2RTmlY66tn4pdFrZ94hNg==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.6", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "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.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", + "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "react-native": ">=0.69", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-relative": { + "version": "0.8.7", + "dev": true, + "license": "MIT" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/reselect": { + "version": "5.1.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/mithril-explorer/package.json b/mithril-explorer/package.json index 4175b470e5f..6f0439bae76 100644 --- a/mithril-explorer/package.json +++ b/mithril-explorer/package.json @@ -1,6 +1,6 @@ { "name": "mithril-explorer", - "version": "0.4.6", + "version": "0.4.12", "private": true, "scripts": { "dev": "next dev", @@ -13,27 +13,28 @@ "test:ci": "jest --ci" }, "dependencies": { + "@mithril-dev/mithril-client-wasm": "file:../mithril-client-wasm/pkg", "@popperjs/core": "^2.11.8", - "@reduxjs/toolkit": "^1.9.7", + "@reduxjs/toolkit": "^2.1.0", "bootstrap": "^5.3.2", - "bootstrap-icons": "^1.11.2", - "chart.js": "^4.4.0", - "next": "^14.0.3", + "bootstrap-icons": "^1.11.3", + "chart.js": "^4.4.1", + "next": "^14.1.0", "react": "^18.2.0", - "react-bootstrap": "^2.9.1", + "react-bootstrap": "^2.10.0", "react-chartjs-2": "^5.2.0", "react-dom": "^18.2.0", - "react-redux": "^8.1.3" + "react-redux": "^9.1.0" }, "devDependencies": { - "@testing-library/jest-dom": "^6.1.4", - "@testing-library/react": "^14.1.2", - "eslint": "^8.54.0", - "eslint-config-next": "^14.0.3", + "@testing-library/jest-dom": "^6.4.0", + "@testing-library/react": "^14.2.0", + "eslint": "^8.56.0", + "eslint-config-next": "^14.1.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "next-router-mock": "^0.9.10", - "prettier": "^3.1.0", - "prettier-eslint": "^16.1.2" + "next-router-mock": "^0.9.11", + "prettier": "^3.2.4", + "prettier-eslint": "^16.3.0" } } diff --git a/mithril-explorer/src/aggregators-list.js b/mithril-explorer/src/aggregators-list.js index 3d5a92ae931..17ce7df8d38 100644 --- a/mithril-explorer/src/aggregators-list.js +++ b/mithril-explorer/src/aggregators-list.js @@ -3,6 +3,7 @@ export const defaultAggregators = [ "https://aggregator.release-preprod.api.mithril.network/aggregator", "https://aggregator.pre-release-preview.api.mithril.network/aggregator", "https://aggregator.testing-preview.api.mithril.network/aggregator", + "https://aggregator.testing-sanchonet.api.mithril.network/aggregator", "http://localhost:8080/aggregator", ]; diff --git a/mithril-explorer/src/app/layout.js b/mithril-explorer/src/app/layout.js index 6ab2318d9b0..2dad7b61fc1 100644 --- a/mithril-explorer/src/app/layout.js +++ b/mithril-explorer/src/app/layout.js @@ -1,6 +1,6 @@ import Image from "next/image"; import { Providers } from "../store/provider"; -import React from "react"; +import React, { Suspense } from "react"; import styles from "./explorer.module.css"; // These styles apply to every route in the application @@ -20,19 +20,21 @@ export default function RootLayout({ children }) { - -
-
-

- - Mithril Logo{" "} - Mithril Explorer - -

- {children} -
-
-
+ + +
+
+

+ + Mithril Logo{" "} + Mithril Explorer + +

+ {children} +
+
+
+