From 90696cd0e126d7db3c4ef396ada4bddd3ac0de73 Mon Sep 17 00:00:00 2001 From: Cody Gunton Date: Fri, 8 Nov 2024 12:44:33 -0500 Subject: [PATCH] feat: bb.js tests of ClientIVC (#9412) Extend the ivc-integration-tests suite to execute tests through the wasm and the browser. When run, these tests give both memory and time logs. We should make these easier to read, but for now they're very useful. --- .github/workflows/ci.yml | 79 +- barretenberg/cpp/CMakePresets.json | 44 +- .../barretenberg/client_ivc/client_ivc.cpp | 22 +- .../barretenberg/client_ivc/client_ivc.hpp | 2 +- .../dsl/acir_format/block_constraint.cpp | 1 - .../barretenberg/dsl/acir_proofs/c_bind.cpp | 55 + .../barretenberg/dsl/acir_proofs/c_bind.hpp | 4 + .../src/barretenberg/eccvm/eccvm_prover.cpp | 2 + .../src/barretenberg/eccvm/eccvm_verifier.cpp | 4 +- .../cpp/src/barretenberg/goblin/goblin.hpp | 13 +- .../protogalaxy/protogalaxy_prover_impl.hpp | 4 + .../cpp/src/barretenberg/srs/c_bind.cpp | 1 - .../srs/factories/file_crs_factory.cpp | 4 +- .../srs/factories/mem_bn254_crs_factory.cpp | 2 +- .../factories/mem_grumpkin_crs_factory.cpp | 2 +- .../src/barretenberg/sumcheck/sumcheck.hpp | 5 +- .../transcript/transcript.test.cpp | 182 +- .../translator_vm/translator_prover.cpp | 1 + .../ultra_honk/decider_proving_key.hpp | 33 +- barretenberg/ts/package.json | 3 + barretenberg/ts/src/barretenberg/backend.ts | 32 + barretenberg/ts/src/barretenberg/index.ts | 15 +- barretenberg/ts/src/barretenberg_api/index.ts | 12 + .../barretenberg_wasm_main/index.ts | 2 +- .../ts/src/crs/browser/cached_net_crs.ts | 42 +- barretenberg/ts/src/crs/browser/index.ts | 2 +- barretenberg/ts/src/crs/index.ts | 2 +- barretenberg/ts/src/crs/net_crs.ts | 48 + barretenberg/ts/src/crs/node/index.ts | 45 +- barretenberg/ts/src/index.ts | 3 +- barretenberg/ts/src/main.ts | 60 +- barretenberg/ts/yarn.lock | 24 + yarn-project/Earthfile | 2 + yarn-project/bb-prover/src/bb/execute.ts | 2 +- yarn-project/ivc-integration/package.json | 30 +- .../ivc-integration/package.local.json | 7 +- .../ivc-integration/run_browser_tests.sh | 20 + yarn-project/ivc-integration/serve.mt.json | 17 + .../browser_client_ivc_integration.test.ts | 98 + yarn-project/ivc-integration/src/index.html | 9 + yarn-project/ivc-integration/src/index.ts | 123 + .../src/native_client_ivc_integration.test.ts | 82 + yarn-project/ivc-integration/src/serve.ts | 22 + ...ts => wasm_client_ivc_integration.test.ts} | 80 +- .../ivc-integration/webpack.config.js | 45 + yarn-project/yarn.lock | 2034 ++++++++++++++++- 46 files changed, 2986 insertions(+), 335 deletions(-) create mode 100755 yarn-project/ivc-integration/run_browser_tests.sh create mode 100644 yarn-project/ivc-integration/serve.mt.json create mode 100644 yarn-project/ivc-integration/src/browser_client_ivc_integration.test.ts create mode 100644 yarn-project/ivc-integration/src/index.html create mode 100644 yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts create mode 100644 yarn-project/ivc-integration/src/serve.ts rename yarn-project/ivc-integration/src/{client_ivc_integration.test.ts => wasm_client_ivc_integration.test.ts} (68%) create mode 100644 yarn-project/ivc-integration/webpack.config.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fccc277a7de..3a2c8eab631 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -948,6 +948,7 @@ jobs: merge-check: runs-on: ubuntu-20.04 needs: + # must be kept in sync with rerun-check - setup - configure - build @@ -985,22 +986,7 @@ jobs: - boxes-test # - protocol-circuits-gates-report # non-blocking if: always() - outputs: - failure: ${{ steps.set_failed_jobs.outputs.failure }} - failed_jobs: ${{ steps.set_failed_jobs.outputs.failed_jobs }} steps: - - name: Check for Failures and Set Output - id: set_failed_jobs - env: - # Collect needed jobs - NEEDS_JOBS_JSON: ${{ toJson(needs) }} - run: | - echo "Processing failed jobs..." - failed_jobs=$(echo "$NEEDS_JOBS_JSON" | jq -r 'to_entries[] | select(.value.result == "failure") | .key' | paste -sd "," -) - echo "$failed_jobs" > .failed - echo "failure=${{contains(needs.*.result, 'failure')}}" >> $GITHUB_OUTPUT - echo "failed_jobs=$failed_jobs" >> $GITHUB_OUTPUT - - name: Report overall success (non-draft) if: github.event.pull_request.draft == false env: @@ -1008,7 +994,7 @@ jobs: FAIL: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} run: | if [[ $FAIL == true ]]; then - echo "Jobs failed: $(cat .failed), merging not allowed." + echo "At least one job failed (or cancelled), merging not allowed." exit 1 else echo "All jobs succeeded, merge allowed." @@ -1023,44 +1009,69 @@ jobs: permissions: actions: write needs: - - merge-check + # must be kept in sync with merge-check + - setup + - configure + - build + - e2e + # - bench-e2e # non-blocking + # - acir-bench # non-blocking + # - bench-summary # non-blocking + - bb-gcc + - bb-native-tests + - bb-js-test + - noir-build-acir-tests + - bb-acir-tests-bb + - bb-acir-tests-bb-ultra-plonk + - bb-acir-tests-bb-ultra-honk + - bb-acir-tests-bb-mega-honk + - bb-acir-tests-sol + - bb-acir-tests-sol-honk + - bb-acir-tests-bb-js + - noir-format + - noir-test + - noir-examples + - noir-packages-test + - noir-projects + - avm-format + - yarn-project-formatting + - yarn-project-test + - prover-client-test + - network-test + - kind-network-test + - l1-contracts-test + - docs-preview + # - bb-bench # non-blocking + - boxes + - boxes-test + # - protocol-circuits-gates-report # non-blocking if: github.event.pull_request.draft == false && !cancelled() steps: - name: Check for Rerun env: + # We treat any skipped or failing jobs as a failure for the workflow as a whole. + HAD_FAILURE: ${{ contains(needs.*.result, 'failure') }} GH_REPO: ${{ github.repository }} GH_TOKEN: ${{ github.token }} run: | - if [[ ${{ needs.merge-check.outputs.failure }} == true ]] && [[ $RUN_ATTEMPT -lt 2 ]] ; then + if [[ $HAD_FAILURE == true ]] && [[ $RUN_ATTEMPT -lt 2 ]] ; then echo "Retrying first workflow failure. This is a stop-gap until things are more stable." gh workflow run rerun.yml -F run_id=${{ github.run_id }} fi + # NOTE: we only notify failures after a rerun has occurred notify: - runs-on: ubuntu-20.04 needs: - merge-check + runs-on: ubuntu-20.04 if: github.event.pull_request.draft == false && github.ref == 'refs/heads/master' && failure() && github.run_attempt >= 2 steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Get Authors of Recent Commit - id: get_authors - run: | - git fetch --depth=1 origin ${{ github.sha }} - authors=$(git log -1 --pretty=format:'%an <%ae>' ${{ github.sha }}) - echo "authors=${authors}" >> $GITHUB_OUTPUT - - name: Send notification to aztec3-ci channel if workflow failed on master uses: slackapi/slack-github-action@v1.25.0 with: payload: | { - "text": "Master Github Actions failure", - "url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "authors": "${{ steps.get_authors.outputs.authors }}", - "failed_jobs": "${{ needs.merge-check.outputs.failed_jobs }}" + "url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" } env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_NOTIFY_WORKFLOW_TRIGGER_URL2 }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_NOTIFY_WORKFLOW_TRIGGER_URL }} diff --git a/barretenberg/cpp/CMakePresets.json b/barretenberg/cpp/CMakePresets.json index 202b06038ae..91760acd187 100644 --- a/barretenberg/cpp/CMakePresets.json +++ b/barretenberg/cpp/CMakePresets.json @@ -399,16 +399,6 @@ "MULTITHREADING": "OFF" } }, - { - "name": "wasm-dbg", - "displayName": "Build for debug WASM", - "binaryDir": "build-wasm-dbg", - "description": "Build with wasi-sdk to create debug wasm", - "inherits": "wasm", - "environment": { - "CMAKE_BUILD_TYPE": "Debug" - } - }, { "name": "wasm-threads", "displayName": "Build for pthread enabled WASM", @@ -422,6 +412,29 @@ "MULTITHREADING": "ON" } }, + { + "name": "wasm-threads-dbg", + "displayName": "Build for debug WASM", + "binaryDir": "build-wasm-threads-dbg", + "description": "Build with wasi-sdk to create debug wasm", + "inherits": "wasm", + "environment": { + "CMAKE_BUILD_TYPE": "Debug" + }, + "cacheVariables": { + "MULTITHREADING": "ON" + } + }, + { + "name": "wasm-threads-assert", + "displayName": "Build for WASM with multithreading and and asserts", + "binaryDir": "build-wasm-threads-assert", + "description": "Build with wasi-sdk with asserts", + "inherits": "wasm-threads", + "environment": { + "CMAKE_BUILD_TYPE": "RelWithAssert" + } + }, { "name": "xray", "displayName": "Build with multi-threaded XRay Profiling", @@ -618,8 +631,15 @@ "targets": ["barretenberg.wasm", "barretenberg", "wasi", "env"] }, { - "name": "wasm-dbg", - "configurePreset": "wasm-dbg", + "name": "wasm-threads-dbg", + "configurePreset": "wasm-threads-dbg", + "inheritConfigureEnvironment": true, + "jobs": 0, + "targets": ["barretenberg.wasm"] + }, + { + "name": "wasm-threads-assert", + "configurePreset": "wasm-threads-assert", "inheritConfigureEnvironment": true, "jobs": 0, "targets": ["barretenberg.wasm"] diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp index 8888104dca0..73d0687fb8e 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp @@ -180,6 +180,7 @@ void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptrproving_key.commitment_key); } + vinfo("getting honk vk... precomputed?: ", precomputed_vk); // Update the accumulator trace usage based on the present circuit trace_usage_tracker.update(circuit); @@ -188,11 +189,14 @@ void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptrset_metadata(proving_key->proving_key); } + vinfo("set honk vk metadata"); // If this is the first circuit in the IVC, use oink to complete the decider proving key and generate an oink proof if (!initialized) { OinkProver oink_prover{ proving_key }; + vinfo("computing oink proof..."); oink_prover.prove(); + vinfo("oink proof constructed"); proving_key->is_accumulator = true; // indicate to PG that it should not run oink on this key // Initialize the gate challenges to zero for use in first round of folding proving_key->gate_challenges = std::vector(CONST_PG_LOG_N, 0); @@ -206,7 +210,9 @@ void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptr& ultra_vk, + const std::shared_ptr& mega_vk, const std::shared_ptr& eccvm_vk, const std::shared_ptr& translator_vk) { // Verify the hiding circuit proof - MegaVerifier verifer{ ultra_vk }; - bool ultra_verified = verifer.verify_proof(proof.mega_proof); - vinfo("Mega verified: ", ultra_verified); + MegaVerifier verifer{ mega_vk }; + bool mega_verified = verifer.verify_proof(proof.mega_proof); + vinfo("Mega verified: ", mega_verified); // Goblin verification (final merge, eccvm, translator) GoblinVerifier goblin_verifier{ eccvm_vk, translator_vk }; bool goblin_verified = goblin_verifier.verify(proof.goblin_proof); vinfo("Goblin verified: ", goblin_verified); - return goblin_verified && ultra_verified; + return goblin_verified && mega_verified; } /** @@ -331,8 +337,10 @@ bool ClientIVC::verify(const Proof& proof) */ HonkProof ClientIVC::decider_prove() const { + vinfo("prove decider..."); MegaDeciderProver decider_prover(fold_output.accumulator); return decider_prover.construct_proof(); + vinfo("finished decider proving."); } /** @@ -343,7 +351,11 @@ HonkProof ClientIVC::decider_prove() const */ bool ClientIVC::prove_and_verify() { + auto start = std::chrono::steady_clock::now(); auto proof = prove(); + auto end = std::chrono::steady_clock::now(); + auto diff = std::chrono::duration_cast(end - start); + vinfo("time to call ClientIVC::prove: ", diff, " ms."); return verify(proof); } diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp index 76ae3840813..3c48e73de49 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp @@ -155,7 +155,7 @@ class ClientIVC { HonkProof construct_and_prove_hiding_circuit(); static bool verify(const Proof& proof, - const std::shared_ptr& ultra_vk, + const std::shared_ptr& mega_vk, const std::shared_ptr& eccvm_vk, const std::shared_ptr& translator_vk); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/block_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/block_constraint.cpp index 0e2bf5d74de..0549a1bbeed 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/block_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/block_constraint.cpp @@ -86,7 +86,6 @@ void create_block_constraints(MegaCircuitBuilder& builder, process_call_data_operations(builder, constraint, has_valid_witness_assignments, init); // The presence of calldata is used to indicate that the present circuit is a kernel. This is needed in the // databus consistency checks to indicate that the corresponding return data belongs to a kernel (else an app). - info("ACIR: Setting is_kernel to TRUE."); builder.databus_propagation_data.is_kernel = true; } break; case BlockType::ReturnData: { diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp index b9c1253eaf5..2f8188f46a5 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp @@ -9,6 +9,7 @@ #include "barretenberg/dsl/acir_format/acir_format.hpp" #include "barretenberg/plonk/proof_system/proving_key/serialize.hpp" #include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp" +#include "barretenberg/serialize/msgpack.hpp" #include "barretenberg/srs/global_crs.hpp" #include #include @@ -218,6 +219,60 @@ WASM_EXPORT void acir_serialize_verification_key_into_fields(in_ptr acir_compose write(out_key_hash, vk_hash); } +WASM_EXPORT void acir_prove_and_verify_aztec_client(uint8_t const* acir_stack, + uint8_t const* witness_stack, + bool* verified) +{ + using Program = acir_format::AcirProgram; + + std::vector> witnesses = from_buffer>>(witness_stack); + std::vector> acirs = from_buffer>>(acir_stack); + std::vector folding_stack; + + for (auto [bincode, wit] : zip_view(acirs, witnesses)) { + acir_format::WitnessVector witness = acir_format::witness_buf_to_witness_data(wit); + acir_format::AcirFormat constraints = + acir_format::circuit_buf_to_acir_format(bincode, /*honk_recursion=*/false); + folding_stack.push_back(Program{ constraints, witness }); + } + // TODO(#7371) dedupe this with the rest of the similar code + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1101): remove use of auto_verify_mode + ClientIVC ivc; + ivc.auto_verify_mode = true; + ivc.trace_structure = TraceStructure::E2E_FULL_TEST; + + // Accumulate the entire program stack into the IVC + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1116): remove manual setting of is_kernel once databus + // has been integrated into noir kernel programs + bool is_kernel = false; + auto start = std::chrono::steady_clock::now(); + for (Program& program : folding_stack) { + // Construct a bberg circuit from the acir representation then accumulate it into the IVC + vinfo("constructing circuit..."); + auto circuit = acir_format::create_circuit( + program.constraints, false, 0, program.witness, false, ivc.goblin.op_queue); + + // Set the internal is_kernel flag based on the local mechanism only if it has not already been set to true + if (!circuit.databus_propagation_data.is_kernel) { + circuit.databus_propagation_data.is_kernel = is_kernel; + } + is_kernel = !is_kernel; + + vinfo("done constructing circuit. calling ivc.accumulate..."); + ivc.accumulate(circuit); + vinfo("done accumulating."); + } + auto end = std::chrono::steady_clock::now(); + auto diff = std::chrono::duration_cast(end - start); + vinfo("time to construct and accumulate all circuits: ", diff); + + vinfo("calling ivc.prove_and_verify..."); + bool result = ivc.prove_and_verify(); + info("verified?: ", result); + + *verified = result; +} + WASM_EXPORT void acir_prove_ultra_honk(uint8_t const* acir_vec, bool const* recursive, uint8_t const* witness_vec, diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp index 9efd50e4721..64197459b27 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp @@ -49,6 +49,10 @@ WASM_EXPORT void acir_prove_and_verify_mega_honk(uint8_t const* constraint_syste uint8_t const* witness_buf, bool* result); +WASM_EXPORT void acir_prove_and_verify_aztec_client(uint8_t const* constraint_system_buf, + uint8_t const* witness_buf, + bool* result); + /** * @brief Fold and verify a set of circuits using ClientIvc * diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index bf10760c8ff..f16243fbb1c 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -187,6 +187,8 @@ void ECCVMProver::execute_pcs_rounds() // Produce another challenge passed as input to the translator verifier translation_batching_challenge_v = transcript->template get_challenge("Translation:batching_challenge"); + + vinfo("computed opening proof"); } HonkProof ECCVMProver::export_proof() diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp index db1c11170d1..7924f578387 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp @@ -65,6 +65,7 @@ bool ECCVMVerifier::verify_proof(const HonkProof& proof) sumcheck.verify(relation_parameters, alpha, gate_challenges); // If Sumcheck did not verify, return false if (sumcheck_verified.has_value() && !sumcheck_verified.value()) { + vinfo("eccvm sumcheck failed"); return false; } // Compute the Shplemini accumulator consisting of the Shplonk evaluation and the commitments and scalars vector @@ -127,7 +128,8 @@ bool ECCVMVerifier::verify_proof(const HonkProof& proof) const bool batched_opening_verified = PCS::reduce_verify(key->pcs_verification_key, batch_opening_claim, transcript); - + vinfo("eccvm sumcheck verified?: ", sumcheck_verified.value()); + vinfo("batch opening verified?: ", batched_opening_verified); return sumcheck_verified.value() && batched_opening_verified; } } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp index fcfd0d78913..a8580ae94a7 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp @@ -234,16 +234,16 @@ class GoblinProver { goblin_proof.merge_proof = merge_proof_in.empty() ? std::move(merge_proof) : std::move(merge_proof_in); { - PROFILE_THIS_NAME("prove_eccvm"); - + vinfo("prove eccvm..."); prove_eccvm(); + vinfo("finished eccvm proving."); } { - PROFILE_THIS_NAME("prove_translator"); - + vinfo("prove translator..."); prove_translator(); + vinfo("finished translator proving."); } return goblin_proof; }; @@ -298,6 +298,11 @@ class GoblinVerifier { // correctly bool translation_verified = translator_verifier.verify_translation(proof.translation_evaluations); + vinfo("merge verified?: ", merge_verified); + vinfo("eccvm verified?: ", eccvm_verified); + vinfo("accumulator construction_verified?: ", accumulator_construction_verified); + vinfo("translation verified?: ", translation_verified); + return merge_verified && eccvm_verified && accumulator_construction_verified && translation_verified; }; }; diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp index c974edfba32..bd7c0ee1701 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp @@ -170,14 +170,18 @@ FoldingResult ProtogalaxyProver_gate_challenges, alphas, relation_parameters, perturbator_evaluation, combiner_quotient) = combiner_quotient_round(accumulator->gate_challenges, deltas, keys_to_fold); + vinfo("combiner quotient round"); const FoldingResult result = update_target_sum_and_fold( keys_to_fold, combiner_quotient, alphas, relation_parameters, perturbator_evaluation); + vinfo("folded"); return result; } diff --git a/barretenberg/cpp/src/barretenberg/srs/c_bind.cpp b/barretenberg/cpp/src/barretenberg/srs/c_bind.cpp index 96514f54617..90094a8b0bc 100644 --- a/barretenberg/cpp/src/barretenberg/srs/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/srs/c_bind.cpp @@ -31,6 +31,5 @@ WASM_EXPORT void srs_init_grumpkin_srs(uint8_t const* points_buf, uint32_t const { auto points = std::vector(ntohl(*num_points)); srs::IO::read_affine_elements_from_buffer(points.data(), (char*)points_buf, points.size() * 64); - bb::srs::init_grumpkin_crs_factory(points); } \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.cpp b/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.cpp index c0d664ca9de..105528e39c4 100644 --- a/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.cpp +++ b/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.cpp @@ -62,7 +62,7 @@ std::shared_ptr> FileCrsFactory::get if (prover_degree_ < degree || !prover_crs_) { prover_crs_ = std::make_shared>(degree, path_); prover_degree_ = degree; - vinfo("Initializing ", Curve::name, " prover CRS from file of size ", degree); + vinfo("Initialized ", Curve::name, " prover CRS from file of size ", degree); } return prover_crs_; } @@ -73,7 +73,7 @@ std::shared_ptr> FileCrsFactory::g if (verifier_degree_ < degree || !verifier_crs_) { verifier_crs_ = std::make_shared>(path_, degree); verifier_degree_ = degree; - vinfo("Initializing ", Curve::name, " verifier CRS from file of size ", degree); + vinfo("Initialized ", Curve::name, " verifier CRS from file of size ", degree); } return verifier_crs_; } diff --git a/barretenberg/cpp/src/barretenberg/srs/factories/mem_bn254_crs_factory.cpp b/barretenberg/cpp/src/barretenberg/srs/factories/mem_bn254_crs_factory.cpp index 75c7f950147..7c41eeaf665 100644 --- a/barretenberg/cpp/src/barretenberg/srs/factories/mem_bn254_crs_factory.cpp +++ b/barretenberg/cpp/src/barretenberg/srs/factories/mem_bn254_crs_factory.cpp @@ -52,7 +52,7 @@ MemBn254CrsFactory::MemBn254CrsFactory(std::vector const& po verifier_crs_ = std::make_shared(g2_point, g1_identity); - vinfo("Initializing ", + vinfo("Initialized ", curve::BN254::name, " prover CRS from memory with num points = ", prover_crs_->get_monomial_size()); diff --git a/barretenberg/cpp/src/barretenberg/srs/factories/mem_grumpkin_crs_factory.cpp b/barretenberg/cpp/src/barretenberg/srs/factories/mem_grumpkin_crs_factory.cpp index 88ab4bc3b16..e870b7de6c8 100644 --- a/barretenberg/cpp/src/barretenberg/srs/factories/mem_grumpkin_crs_factory.cpp +++ b/barretenberg/cpp/src/barretenberg/srs/factories/mem_grumpkin_crs_factory.cpp @@ -45,7 +45,7 @@ MemGrumpkinCrsFactory::MemGrumpkinCrsFactory(std::vector>(points)) , verifier_crs_(std::make_shared(points)) { - vinfo("Initializing ", + vinfo("Initialized ", curve::Grumpkin::name, " prover CRS from memory with num points = ", prover_crs_->get_monomial_size()); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp index f45a5ba402d..887730da472 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp @@ -202,6 +202,7 @@ template class SumcheckProver { // compute_univariate also takes into account the zk_sumcheck_data. auto round_univariate = round.compute_univariate( round_idx, full_polynomials, relation_parameters, gate_separators, alpha, zk_sumcheck_data); + vinfo("starting sumcheck rounds..."); { PROFILE_THIS_NAME("rest of sumcheck round 1"); @@ -221,7 +222,6 @@ template class SumcheckProver { // release memory? // All but final round // We operate on partially_evaluated_polynomials in place. } - vinfo("completed sumcheck round 0"); for (size_t round_idx = 1; round_idx < multivariate_d; round_idx++) { PROFILE_THIS_NAME("sumcheck loop"); @@ -246,8 +246,8 @@ template class SumcheckProver { gate_separators.partially_evaluate(round_challenge); round.round_size = round.round_size >> 1; - vinfo("completed sumcheck round ", round_idx); } + vinfo("completed ", multivariate_d, " rounds of sumcheck"); // Zero univariates are used to pad the proof to the fixed size CONST_PROOF_SIZE_LOG_N. auto zero_univariate = bb::Univariate::zero(); @@ -279,6 +279,7 @@ template class SumcheckProver { multivariate_evaluations, zk_sumcheck_data.libra_evaluations }; } + vinfo("finished sumcheck"); }; /** diff --git a/barretenberg/cpp/src/barretenberg/transcript/transcript.test.cpp b/barretenberg/cpp/src/barretenberg/transcript/transcript.test.cpp index 38260aa5a4a..69e5c91df3c 100644 --- a/barretenberg/cpp/src/barretenberg/transcript/transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/transcript/transcript.test.cpp @@ -22,6 +22,7 @@ TEST(NativeTranscript, TwoProversTwoFields) Transcript prover_transcript; // state initializes to zero + EXPECT_STATE(prover_transcript, /*start*/ 0, /*written*/ 0, /*read*/ 0); Fr elt_a = 1377; prover_transcript.send_to_verifier("a", elt_a); @@ -36,76 +37,111 @@ TEST(NativeTranscript, TwoProversTwoFields) EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 1, /*read*/ 1); EXPECT_EQ(received_a, elt_a); - // send grumpkin::fr - Fq elt_b = 773; - prover_transcript.send_to_verifier("b", elt_b); - EXPECT_STATE(prover_transcript, /*start*/ 1, /*written*/ 2, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 3, /*written*/ 0, /*read*/ 0); - // load proof is not an action by a prover or verifier, so it does not change read/write counts - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 1, /*read*/ 1); - Fq received_b = verifier_transcript.receive_from_prover("b"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 3, /*read*/ 3); - EXPECT_EQ(received_b, elt_b); - - // send uint32_t - uint32_t elt_c = 43; - prover_transcript.send_to_verifier("c", elt_c); - EXPECT_STATE(prover_transcript, /*start*/ 3, /*written*/ 1, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 4, /*written*/ 0, /*read*/ 0); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 3, /*read*/ 3); - auto received_c = verifier_transcript.receive_from_prover("c"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 4, /*read*/ 4); - EXPECT_EQ(received_c, elt_c); - - // send curve::BN254::AffineElement - curve::BN254::AffineElement elt_d = bb::g1::affine_one; - prover_transcript.send_to_verifier("d", elt_d); - EXPECT_STATE(prover_transcript, /*start*/ 4, /*written*/ 4, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 8, /*written*/ 0, /*read*/ 0); - auto received_d = verifier_transcript.receive_from_prover("d"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 8, /*read*/ 8); - EXPECT_EQ(received_d, elt_d); - - // send std::array - std::array elt_e = { 1, 2, 3, 4, 5 }; - prover_transcript.send_to_verifier("e", elt_e); - EXPECT_STATE(prover_transcript, /*start*/ 8, /*written*/ 5, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 13, /*written*/ 0, /*read*/ 0); - auto received_e = verifier_transcript.receive_from_prover>("e"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 13, /*read*/ 13); - EXPECT_EQ(received_e, elt_e); - - // send std::array - std::array elt_f = { 9, 12515, 1231, 745, 124, 6231, 957 }; - prover_transcript.send_to_verifier("f", elt_f); - EXPECT_STATE(prover_transcript, /*start*/ 13, /*written*/ 14, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 27, /*written*/ 0, /*read*/ 0); - auto received_f = verifier_transcript.receive_from_prover>("f"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 27, /*read*/ 27); - EXPECT_EQ(received_f, elt_f); - - // send Univariate - bb::Univariate elt_g{ std::array({ 5, 6, 7, 8 }) }; - prover_transcript.send_to_verifier("g", elt_g); - EXPECT_STATE(prover_transcript, /*start*/ 27, /*written*/ 4, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 31, /*written*/ 0, /*read*/ 0); - auto received_g = verifier_transcript.receive_from_prover>("g"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 31, /*read*/ 31); - EXPECT_EQ(received_g, elt_g); - - // send Univariate - bb::Univariate elt_h{ std::array({ 9, 10, 11 }) }; - prover_transcript.send_to_verifier("h", elt_h); - EXPECT_STATE(prover_transcript, /*start*/ 31, /*written*/ 6, /*read*/ 0); - verifier_transcript.load_proof(prover_transcript.export_proof()); - EXPECT_STATE(prover_transcript, /*start*/ 37, /*written*/ 0, /*read*/ 0); - auto received_h = verifier_transcript.receive_from_prover>("h"); - EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 37, /*read*/ 37); - EXPECT_EQ(received_h, elt_h); -} + { // send grumpkin::fr + Fq elt_b = 773; + prover_transcript.send_to_verifier("b", elt_b); + EXPECT_STATE(prover_transcript, /*start*/ 1, /*written*/ 2, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 3, /*written*/ 0, /*read*/ 0); + // load proof is not an action by a prover or verifier, so it does not change read/write counts + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 1, /*read*/ 1); + Fq received_b = verifier_transcript.receive_from_prover("b"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 3, /*read*/ 3); + EXPECT_EQ(received_b, elt_b); + } + { // send uint32_t + uint32_t elt_c = 43; + prover_transcript.send_to_verifier("c", elt_c); + EXPECT_STATE(prover_transcript, /*start*/ 3, /*written*/ 1, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 4, /*written*/ 0, /*read*/ 0); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 3, /*read*/ 3); + auto received_c = verifier_transcript.receive_from_prover("c"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 4, /*read*/ 4); + EXPECT_EQ(received_c, elt_c); + } + { // send curve::BN254::AffineElement + curve::BN254::AffineElement elt_d = bb::g1::affine_one; + prover_transcript.send_to_verifier("d", elt_d); + EXPECT_STATE(prover_transcript, /*start*/ 4, /*written*/ 4, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 8, /*written*/ 0, /*read*/ 0); + auto received_d = verifier_transcript.receive_from_prover("d"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 8, /*read*/ 8); + EXPECT_EQ(received_d, elt_d); + } + { // send std::array + std::array elt_e = { 1, 2, 3, 4, 5 }; + prover_transcript.send_to_verifier("e", elt_e); + EXPECT_STATE(prover_transcript, /*start*/ 8, /*written*/ 5, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 13, /*written*/ 0, /*read*/ 0); + auto received_e = verifier_transcript.receive_from_prover>("e"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 13, /*read*/ 13); + EXPECT_EQ(received_e, elt_e); + } + { // send std::array + std::array elt_f = { 9, 12515, 1231, 745, 124, 6231, 957 }; + prover_transcript.send_to_verifier("f", elt_f); + EXPECT_STATE(prover_transcript, /*start*/ 13, /*written*/ 14, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 27, /*written*/ 0, /*read*/ 0); + auto received_f = verifier_transcript.receive_from_prover>("f"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 27, /*read*/ 27); + EXPECT_EQ(received_f, elt_f); + } + { // send Univariate + bb::Univariate elt_g{ std::array({ 5, 6, 7, 8 }) }; + prover_transcript.send_to_verifier("g", elt_g); + EXPECT_STATE(prover_transcript, /*start*/ 27, /*written*/ 4, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 31, /*written*/ 0, /*read*/ 0); + auto received_g = verifier_transcript.receive_from_prover>("g"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 31, /*read*/ 31); + EXPECT_EQ(received_g, elt_g); + } + { // send Univariate + bb::Univariate elt_h{ std::array({ 9, 10, 11 }) }; + prover_transcript.send_to_verifier("h", elt_h); + EXPECT_STATE(prover_transcript, /*start*/ 31, /*written*/ 6, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 37, /*written*/ 0, /*read*/ 0); + auto received_h = verifier_transcript.receive_from_prover>("h"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 37, /*read*/ 37); + EXPECT_EQ(received_h, elt_h); + } + { // send curve::Grumpkin::AffineElement + curve::Grumpkin::AffineElement elt_i = grumpkin::g1::affine_one; + prover_transcript.send_to_verifier("i", elt_i); + EXPECT_STATE(prover_transcript, /*start*/ 37, /*written*/ 2, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 39, /*written*/ 0, /*read*/ 0); + auto received_i = verifier_transcript.receive_from_prover("i"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 39, /*read*/ 39); + EXPECT_EQ(received_i, elt_i); + } + { // send curve::Grumpkin::AffineElement point at infinity + curve::Grumpkin::AffineElement elt_j = grumpkin::g1::affine_one; + elt_j.self_set_infinity(); + prover_transcript.send_to_verifier("j", elt_j); + EXPECT_STATE(prover_transcript, /*start*/ 39, /*written*/ 2, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 41, /*written*/ 0, /*read*/ 0); + auto received_j = verifier_transcript.receive_from_prover("j"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 41, /*read*/ 41); + EXPECT_TRUE(received_j.is_point_at_infinity()); + EXPECT_EQ(received_j, elt_j); + } + { // send curve::BN254::AffineElement point at infinity + curve::BN254::AffineElement elt_k = bb::g1::affine_one; + elt_k.self_set_infinity(); + prover_transcript.send_to_verifier("k", elt_k); + EXPECT_STATE(prover_transcript, /*start*/ 41, /*written*/ 4, /*read*/ 0); + verifier_transcript.load_proof(prover_transcript.export_proof()); + EXPECT_STATE(prover_transcript, /*start*/ 45, /*written*/ 0, /*read*/ 0); + auto received_k = verifier_transcript.receive_from_prover("k"); + EXPECT_STATE(verifier_transcript, /*start*/ 0, /*written*/ 45, /*read*/ 45); + EXPECT_TRUE(received_k.is_point_at_infinity()); + EXPECT_EQ(received_k, elt_k); + } +} \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/translator_prover.cpp index 1c3788e09be..0172648feeb 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/translator_prover.cpp @@ -220,6 +220,7 @@ HonkProof TranslatorProver::construct_proof() // Fiat-Shamir: rho, y, x, z // Execute Shplemini PCS execute_pcs_rounds(); + vinfo("computed opening proof"); return export_proof(); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp index 010784df2ea..b07e6cdb9a0 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp @@ -51,13 +51,11 @@ template class DeciderProvingKey_ { : is_structured(trace_structure != TraceStructure::NONE) { PROFILE_THIS_NAME("DeciderProvingKey(Circuit&)"); - vinfo("DeciderProvingKey(Circuit&)"); - vinfo("creating decider proving key"); + vinfo("Constructing DeciderProvingKey"); + auto start = std::chrono::steady_clock::now(); circuit.finalize_circuit(/* ensure_nonzero = */ true); - info("Finalized circuit size: ", circuit.num_gates); - // If using a structured trace, set fixed block sizes, check their validity, and set the dyadic circuit size if (is_structured) { circuit.blocks.set_fixed_block_sizes(trace_structure); // set the fixed sizes for each block @@ -67,7 +65,10 @@ template class DeciderProvingKey_ { dyadic_circuit_size = compute_dyadic_size(circuit); // set dyadic size directly from circuit block sizes } - info("Log dyadic circuit size: ", numeric::get_msb(dyadic_circuit_size)); + info("Finalized circuit size: ", + circuit.num_gates, + "\nLog dyadic circuit size: ", + numeric::get_msb(dyadic_circuit_size)); // Complete the public inputs execution trace block from circuit.public_inputs Trace::populate_public_inputs_block(circuit); @@ -82,7 +83,6 @@ template class DeciderProvingKey_ { { PROFILE_THIS_NAME("constructing proving key"); - vinfo("constructing proving key"); proving_key = ProvingKey(dyadic_circuit_size, circuit.public_inputs.size(), commitment_key); if (IsGoblinFlavor && !is_structured) { @@ -92,7 +92,6 @@ template class DeciderProvingKey_ { // Allocate the wires and selectors polynomials { PROFILE_THIS_NAME("allocating wires"); - vinfo("allocating wires"); for (auto& wire : proving_key.polynomials.get_wires()) { wire = Polynomial::shiftable(proving_key.circuit_size); @@ -100,7 +99,6 @@ template class DeciderProvingKey_ { } { PROFILE_THIS_NAME("allocating gate selectors"); - vinfo("allocating gate selectors"); // Define gate selectors over the block they are isolated to for (auto [selector, block] : @@ -122,7 +120,6 @@ template class DeciderProvingKey_ { } { PROFILE_THIS_NAME("allocating non-gate selectors"); - vinfo("allocating non-gate selectors"); // Set the other non-gate selector polynomials to full size for (auto& selector : proving_key.polynomials.get_non_gate_selectors()) { @@ -131,7 +128,6 @@ template class DeciderProvingKey_ { } if constexpr (IsGoblinFlavor) { PROFILE_THIS_NAME("allocating ecc op wires and selector"); - vinfo("allocating ecc op wires and selector"); // Allocate the ecc op wires and selector const size_t ecc_op_block_size = circuit.blocks.ecc_op.get_fixed_size(is_structured); @@ -170,7 +166,6 @@ template class DeciderProvingKey_ { size_t table_offset = dyadic_circuit_size - max_tables_size; { PROFILE_THIS_NAME("allocating table polynomials"); - vinfo("allocating table polynomials"); ASSERT(dyadic_circuit_size > max_tables_size); @@ -183,7 +178,6 @@ template class DeciderProvingKey_ { } { PROFILE_THIS_NAME("allocating sigmas and ids"); - vinfo("allocating sigmas and ids"); for (auto& sigma : proving_key.polynomials.get_sigmas()) { sigma = typename Flavor::Polynomial(proving_key.circuit_size); @@ -195,7 +189,6 @@ template class DeciderProvingKey_ { { ZoneScopedN("allocating lookup read counts and tags"); // Allocate the read counts and tags polynomials - vinfo("allocating lookup read counts and tags"); proving_key.polynomials.lookup_read_counts = typename Flavor::Polynomial(max_tables_size, dyadic_circuit_size, table_offset); proving_key.polynomials.lookup_read_tags = @@ -204,7 +197,6 @@ template class DeciderProvingKey_ { { ZoneScopedN("allocating lookup and databus inverses"); // Allocate the lookup_inverses polynomial - vinfo("allocating lookup and databus inverses"); const size_t lookup_offset = static_cast(circuit.blocks.lookup.trace_offset); // TODO(https://github.com/AztecProtocol/barretenberg/issues/1033): construct tables and counts // at top of trace @@ -232,15 +224,15 @@ template class DeciderProvingKey_ { } { PROFILE_THIS_NAME("constructing z_perm"); - vinfo("constructing z_perm"); // Allocate the z_perm polynomial + vinfo("constructing z_perm..."); proving_key.polynomials.z_perm = Polynomial::shiftable(proving_key.circuit_size); + vinfo("done constructing z_perm."); } { PROFILE_THIS_NAME("allocating lagrange polynomials"); - vinfo("allocating lagrange polynomials"); // First and last lagrange polynomials (in the full circuit size) proving_key.polynomials.lagrange_first = Polynomial(1, dyadic_circuit_size, 0); @@ -253,16 +245,16 @@ template class DeciderProvingKey_ { } // Construct and add to proving key the wire, selector and copy constraint polynomials + vinfo("populating trace..."); Trace::populate(circuit, proving_key, is_structured); + vinfo("done populating trace."); { PROFILE_THIS_NAME("constructing prover instance after trace populate"); - vinfo("constructing prover instance after trace populate"); // If Goblin, construct the databus polynomials if constexpr (IsGoblinFlavor) { PROFILE_THIS_NAME("constructing databus polynomials"); - vinfo("constructing databus polynomials"); construct_databus_polynomials(circuit); } @@ -273,7 +265,6 @@ template class DeciderProvingKey_ { { PROFILE_THIS_NAME("constructing lookup table polynomials"); - vinfo("constructing lookup table polynomials"); construct_lookup_table_polynomials( proving_key.polynomials.get_tables(), circuit, dyadic_circuit_size); @@ -281,7 +272,6 @@ template class DeciderProvingKey_ { { PROFILE_THIS_NAME("constructing lookup read counts"); - vinfo("constructing lookup read counts"); construct_lookup_read_counts(proving_key.polynomials.lookup_read_counts, proving_key.polynomials.lookup_read_tags, @@ -303,6 +293,9 @@ template class DeciderProvingKey_ { if constexpr (IsGoblinFlavor) { // Set databus commitment propagation data proving_key.databus_propagation_data = circuit.databus_propagation_data; } + auto end = std::chrono::steady_clock::now(); + auto diff = std::chrono::duration_cast(end - start); + vinfo("time to construct proving key: ", diff, " ms."); } DeciderProvingKey_() = default; diff --git a/barretenberg/ts/package.json b/barretenberg/ts/package.json index 160dd3f927a..f24d9556a24 100644 --- a/barretenberg/ts/package.json +++ b/barretenberg/ts/package.json @@ -60,10 +60,12 @@ }, "devDependencies": { "@jest/globals": "^29.4.3", + "@msgpack/msgpack": "^3.0.0-beta2", "@types/debug": "^4.1.7", "@types/detect-node": "^2.0.0", "@types/jest": "^29.4.0", "@types/node": "^18.7.23", + "@types/pako": "^2.0.3", "@types/source-map-support": "^0.5.6", "@typescript-eslint/eslint-plugin": "^5.54.1", "@typescript-eslint/parser": "^5.54.1", @@ -74,6 +76,7 @@ "html-webpack-plugin": "^5.5.1", "idb-keyval": "^6.2.1", "jest": "^29.5.0", + "pako": "^2.1.0", "prettier": "^2.8.4", "resolve-typescript-plugin": "^2.0.1", "ts-jest": "^29.1.0", diff --git a/barretenberg/ts/src/barretenberg/backend.ts b/barretenberg/ts/src/barretenberg/backend.ts index 4657463be90..4d8e89116b3 100644 --- a/barretenberg/ts/src/barretenberg/backend.ts +++ b/barretenberg/ts/src/barretenberg/backend.ts @@ -258,6 +258,38 @@ export class UltraHonkBackend { } } +export class AztecClientBackend { + // These type assertions are used so that we don't + // have to initialize `api` in the constructor. + // These are initialized asynchronously in the `init` function, + // constructors cannot be asynchronous which is why we do this. + + protected api!: Barretenberg; + + constructor(protected acirMsgpack: Uint8Array[], protected options: BackendOptions = { threads: 1 }) {} + + /** @ignore */ + async instantiate(): Promise { + if (!this.api) { + const api = await Barretenberg.new(this.options); + await api.initSRSClientIVC(); + this.api = api; + } + } + + async proveAndVerify(witnessMsgpack: Uint8Array[]): Promise { + await this.instantiate(); + return this.api.acirProveAndVerifyAztecClient(this.acirMsgpack, witnessMsgpack); + } + + async destroy(): Promise { + if (!this.api) { + return; + } + await this.api.destroy(); + } +} + // Converts bytecode from a base64 string to a Uint8Array function acirToUint8Array(base64EncodedBytecode: string): Uint8Array { const compressedByteCode = base64Decode(base64EncodedBytecode); diff --git a/barretenberg/ts/src/barretenberg/index.ts b/barretenberg/ts/src/barretenberg/index.ts index 96b9b7d5c23..81481db9130 100644 --- a/barretenberg/ts/src/barretenberg/index.ts +++ b/barretenberg/ts/src/barretenberg/index.ts @@ -5,11 +5,11 @@ import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from '../barretenber import { getRemoteBarretenbergWasm } from '../barretenberg_wasm/helpers/index.js'; import { BarretenbergWasmWorker, fetchModuleAndThreads } from '../barretenberg_wasm/index.js'; import createDebug from 'debug'; -import { Crs } from '../crs/index.js'; +import { Crs, GrumpkinCrs } from '../crs/index.js'; import { RawBuffer } from '../types/raw_buffer.js'; export { BarretenbergVerifier } from './verifier.js'; -export { UltraPlonkBackend, UltraHonkBackend } from './backend.js'; +export { UltraPlonkBackend, UltraHonkBackend, AztecClientBackend } from './backend.js'; const debug = createDebug('bb.js:wasm'); @@ -66,6 +66,17 @@ export class Barretenberg extends BarretenbergApi { await this.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data())); } + async initSRSClientIVC(): Promise { + // crsPath can be undefined + const crs = await Crs.new(2 ** 21 + 1, this.options.crsPath); + const grumpkinCrs = await GrumpkinCrs.new(2 ** 16 + 1, this.options.crsPath); + + // Load CRS into wasm global CRS state. + // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed. + await this.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data())); + await this.srsInitGrumpkinSrs(new RawBuffer(grumpkinCrs.getG1Data()), grumpkinCrs.numPoints); + } + async acirInitSRS(bytecode: Uint8Array, recursive: boolean, honkRecursion: boolean): Promise { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_total, subgroupSize] = await this.acirGetCircuitSizes(bytecode, recursive, honkRecursion); diff --git a/barretenberg/ts/src/barretenberg_api/index.ts b/barretenberg/ts/src/barretenberg_api/index.ts index a6ead4041b4..4d95dfa1887 100644 --- a/barretenberg/ts/src/barretenberg_api/index.ts +++ b/barretenberg/ts/src/barretenberg_api/index.ts @@ -545,6 +545,18 @@ export class BarretenbergApi { return out as any; } + async acirProveAndVerifyAztecClient(acirVec: Uint8Array[], witnessVec: Uint8Array[]): Promise { + const inArgs = [acirVec, witnessVec].map(serializeBufferable); + const outTypes: OutputType[] = [BoolDeserializer()]; + const result = await this.wasm.callWasmExport( + 'acir_prove_and_verify_aztec_client', + inArgs, + outTypes.map(t => t.SIZE_IN_BYTES), + ); + const out = result.map((r, i) => outTypes[i].fromBuffer(r)); + return out[0]; + } + async acirProveUltraHonk(acirVec: Uint8Array, recursive: boolean, witnessVec: Uint8Array): Promise { const inArgs = [acirVec, recursive, witnessVec].map(serializeBufferable); const outTypes: OutputType[] = [BufferDeserializer()]; diff --git a/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts b/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts index 6dc26bc0097..06a57aa5a80 100644 --- a/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +++ b/barretenberg/ts/src/barretenberg_wasm/barretenberg_wasm_main/index.ts @@ -32,7 +32,7 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase { module: WebAssembly.Module, threads = Math.min(getNumCpu(), BarretenbergWasmMain.MAX_THREADS), logger: (msg: string) => void = debug, - initial = 31, + initial = 32, maximum = 2 ** 16, ) { this.logger = logger; diff --git a/barretenberg/ts/src/crs/browser/cached_net_crs.ts b/barretenberg/ts/src/crs/browser/cached_net_crs.ts index 3152933d3b4..e3f9f142b99 100644 --- a/barretenberg/ts/src/crs/browser/cached_net_crs.ts +++ b/barretenberg/ts/src/crs/browser/cached_net_crs.ts @@ -1,4 +1,4 @@ -import { NetCrs } from '../net_crs.js'; +import { NetCrs, NetGrumpkinCrs } from '../net_crs.js'; import { get, set } from 'idb-keyval'; /** @@ -57,3 +57,43 @@ export class CachedNetCrs { return this.g2Data; } } + +/** + * Downloader for CRS from the web or local. + */ +export class CachedNetGrumpkinCrs { + private g1Data!: Uint8Array; + + constructor(public readonly numPoints: number) {} + + static async new(numPoints: number) { + const crs = new CachedNetGrumpkinCrs(numPoints); + await crs.init(); + return crs; + } + + /** + * Download the data. + */ + async init() { + // Check if data is in IndexedDB + const g1Data = await get('grumpkinG1Data'); + const netGrumpkinCrs = new NetGrumpkinCrs(this.numPoints); + const g1DataLength = this.numPoints * 64; + + if (!g1Data || g1Data.length < g1DataLength) { + this.g1Data = await netGrumpkinCrs.downloadG1Data(); + await set('grumpkinG1Data', this.g1Data); + } else { + this.g1Data = g1Data; + } + } + + /** + * G1 points data for prover key. + * @returns The points data. + */ + getG1Data(): Uint8Array { + return this.g1Data; + } +} diff --git a/barretenberg/ts/src/crs/browser/index.ts b/barretenberg/ts/src/crs/browser/index.ts index bce8a12b439..eeb2ec5828b 100644 --- a/barretenberg/ts/src/crs/browser/index.ts +++ b/barretenberg/ts/src/crs/browser/index.ts @@ -1 +1 @@ -export { CachedNetCrs as Crs } from './cached_net_crs.js'; +export { CachedNetCrs as Crs, CachedNetGrumpkinCrs as GrumpkinCrs } from './cached_net_crs.js'; diff --git a/barretenberg/ts/src/crs/index.ts b/barretenberg/ts/src/crs/index.ts index a2f1ee4ca65..7d9281da0aa 100644 --- a/barretenberg/ts/src/crs/index.ts +++ b/barretenberg/ts/src/crs/index.ts @@ -1 +1 @@ -export { Crs } from './node/index.js'; +export { Crs, GrumpkinCrs } from './node/index.js'; diff --git a/barretenberg/ts/src/crs/net_crs.ts b/barretenberg/ts/src/crs/net_crs.ts index 5411a73535b..97dcfa68a95 100644 --- a/barretenberg/ts/src/crs/net_crs.ts +++ b/barretenberg/ts/src/crs/net_crs.ts @@ -65,3 +65,51 @@ export class NetCrs { return this.g2Data; } } + +/** + * Downloader for CRS from the web or local. + */ +export class NetGrumpkinCrs { + private data!: Uint8Array; + + constructor( + /** + * The number of circuit gates. + */ + public readonly numPoints: number, + ) {} + + /** + * Download the data. + */ + async init() { + await this.downloadG1Data(); + } + + async downloadG1Data() { + // Skip the download if numPoints is 0 (would download the entire file due to bad range header otherwise) + if (this.numPoints === 0) { + return (this.data = new Uint8Array([])); + } + + const g1Start = 28; + const g1End = this.numPoints * 64 - 1; + + const response = await fetch('https://aztec-ignition.s3.amazonaws.com/TEST%20GRUMPKIN/monomial/transcript00.dat', { + headers: { + Range: `bytes=${g1Start}-${g1End}`, + }, + cache: 'force-cache', + }); + + return (this.data = new Uint8Array(await response.arrayBuffer())); + } + + /** + * G1 points data for prover key. + * @returns The points data. + */ + getG1Data(): Uint8Array { + return this.data; + } +} diff --git a/barretenberg/ts/src/crs/node/index.ts b/barretenberg/ts/src/crs/node/index.ts index 75ef0878495..11a5e0698f0 100644 --- a/barretenberg/ts/src/crs/node/index.ts +++ b/barretenberg/ts/src/crs/node/index.ts @@ -1,7 +1,6 @@ -import { NetCrs } from '../net_crs.js'; -import { GRUMPKIN_SRS_DEV_PATH, IgnitionFilesCrs } from './ignition_files_crs.js'; +import { NetCrs, NetGrumpkinCrs } from '../net_crs.js'; import { mkdirSync, readFileSync, writeFileSync } from 'fs'; -import { readFile, stat } from 'fs/promises'; +import { stat } from 'fs/promises'; import createDebug from 'debug'; import { homedir } from 'os'; @@ -64,44 +63,28 @@ export class Crs { export class GrumpkinCrs { constructor(public readonly numPoints: number, public readonly path: string) {} - static async new(numPoints: number, crsPath = './crs') { + static async new(numPoints: number, crsPath = homedir() + '/.bb-crs') { const crs = new GrumpkinCrs(numPoints, crsPath); await crs.init(); return crs; } - async downloadG1Data() { - const g1Start = 28; - const g1End = g1Start + this.numPoints * 64 - 1; - - const response = await fetch('https://aztec-ignition.s3.amazonaws.com/TEST%20GRUMPKIN/monomial/transcript00.dat', { - headers: { - Range: `bytes=${g1Start}-${g1End}`, - }, - cache: 'force-cache', - }); - - return new Uint8Array(await response.arrayBuffer()); - } - async init() { mkdirSync(this.path, { recursive: true }); - const size = await readFile(this.path + '/grumpkin_size', 'ascii').catch(() => undefined); - if (size && +size >= this.numPoints) { - debug(`using cached crs of size: ${size}`); + + const g1FileSize = await stat(this.path + '/grumpkin_g1.dat') + .then(stats => stats.size) + .catch(() => 0); + + if (g1FileSize >= this.numPoints * 64 && g1FileSize % 64 == 0) { + debug(`using cached crs of size: ${g1FileSize / 64}`); return; } - // TODO(https://github.com/AztecProtocol/barretenberg/issues/813): implement NetCrs for Grumpkin once SRS is uploaded. - const ignitionCrs = new IgnitionFilesCrs(this.numPoints, GRUMPKIN_SRS_DEV_PATH); - if (ignitionCrs.pathExists()) { - await ignitionCrs.init(); - } - const g1Data = ignitionCrs.pathExists() ? ignitionCrs.getG1Data() : await this.downloadG1Data(); - debug(`loading ignition file crs of size: ${this.numPoints}`); - // await crs.init(); - writeFileSync(this.path + '/grumpkin_size', this.numPoints.toString()); - writeFileSync(this.path + '/grumpkin_g1.dat', g1Data); + debug(`downloading crs of size: ${this.numPoints}`); + const crs = new NetGrumpkinCrs(this.numPoints); + await crs.init(); + writeFileSync(this.path + '/grumpkin_g1.dat', crs.getG1Data()); } /** diff --git a/barretenberg/ts/src/index.ts b/barretenberg/ts/src/index.ts index dc3cee34937..e9ca030a196 100644 --- a/barretenberg/ts/src/index.ts +++ b/barretenberg/ts/src/index.ts @@ -1,4 +1,4 @@ -export { Crs } from './crs/index.js'; +export { Crs, GrumpkinCrs } from './crs/index.js'; export { BackendOptions, Barretenberg, @@ -6,6 +6,7 @@ export { BarretenbergVerifier, UltraPlonkBackend, UltraHonkBackend, + AztecClientBackend, } from './barretenberg/index.js'; export { RawBuffer, Fr } from './types/index.js'; export { splitHonkProof, reconstructHonkProof, ProofData } from './proof/index.js'; diff --git a/barretenberg/ts/src/main.ts b/barretenberg/ts/src/main.ts index 1d3af06dd2e..26e6d7388e3 100755 --- a/barretenberg/ts/src/main.ts +++ b/barretenberg/ts/src/main.ts @@ -1,10 +1,11 @@ #!/usr/bin/env node -import { Crs, Barretenberg, RawBuffer } from './index.js'; -import { GrumpkinCrs } from './crs/node/index.js'; +import { Crs, GrumpkinCrs, Barretenberg, RawBuffer } from './index.js'; import createDebug from 'debug'; import { readFileSync, writeFileSync } from 'fs'; import { gunzipSync } from 'zlib'; +import { ungzip } from 'pako'; import { Command } from 'commander'; +import { decode } from '@msgpack/msgpack'; import { Timer, writeBenchmark } from './benchmark/index.js'; import path from 'path'; createDebug.log = console.error.bind(console); @@ -33,6 +34,26 @@ function getBytecode(bytecodePath: string) { return decompressed; } +function base64ToUint8Array(base64: string) { + const binaryString = atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes; +} + +function readStack(bytecodePath: string, numToDrop = 0) { + const encodedPackedZippedBytecodeArray = readFileSync(bytecodePath, 'utf-8'); + const packedZippedBytecodeArray = base64ToUint8Array(encodedPackedZippedBytecodeArray); + const zipped = decode( + packedZippedBytecodeArray.subarray(0, packedZippedBytecodeArray.length - numToDrop), + ) as Uint8Array[]; + const bytecodeArray = zipped.map((arr: Uint8Array) => ungzip(arr)); + return bytecodeArray; +} + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1126): split this into separate Plonk and Honk functions as their gate count differs async function getGatesUltra(bytecodePath: string, recursive: boolean, honkRecursion: boolean, api: Barretenberg) { const { total } = await computeCircuitSize(bytecodePath, recursive, honkRecursion, api); @@ -105,12 +126,12 @@ async function initUltraHonk(bytecodePath: string, recursive: boolean, crsPath: return { api, circuitSize, dyadicCircuitSize }; } -async function initClientIVC(bytecodePath: string, recursive: boolean, crsPath: string) { +async function initClientIVC(crsPath: string) { const api = await Barretenberg.new({ threads }); debug('loading BN254 and Grumpkin crs...'); - const crs = await Crs.new(2 ** 18 + 1, crsPath); - const grumpkinCrs = await GrumpkinCrs.new(2 ** 14 + 1, crsPath); + const crs = await Crs.new(2 ** 21 + 1, crsPath); + const grumpkinCrs = await GrumpkinCrs.new(2 ** 16 + 1, crsPath); // Load CRS into wasm global CRS state. // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed. @@ -202,6 +223,22 @@ export async function proveAndVerifyMegaHonk( /* eslint-enable camelcase */ } +export async function proveAndVerifyAztecClient(bytecodePath: string, witnessPath: string, crsPath: string) { + /* eslint-disable camelcase */ + const { api } = await initClientIVC(crsPath); + try { + const bytecode = readStack(bytecodePath); + const witness = readStack(witnessPath); + + const verified = await api.acirProveAndVerifyAztecClient(bytecode, witness); + console.log(`verified?: ${verified}`); + return verified; + } finally { + await api.destroy(); + } + /* eslint-enable camelcase */ +} + export async function foldAndVerifyProgram( bytecodePath: string, recursive: boolean, @@ -209,7 +246,7 @@ export async function foldAndVerifyProgram( crsPath: string, ) { /* eslint-disable camelcase */ - const { api } = await initClientIVC(bytecodePath, recursive, crsPath); + const { api } = await initClientIVC(crsPath); try { const bytecode = getBytecode(bytecodePath); const witness = getWitness(witnessPath); @@ -536,6 +573,17 @@ program process.exit(result ? 0 : 1); }); +program + .command('client_ivc_prove_and_verify') + .description('Generate a ClientIVC proof.') + .option('-b, --bytecode-path ', 'Specify the bytecode path', './target/acir.msgpack.b64') + .option('-w, --witness-path ', 'Specify the witness path', './target/witnesses.msgpack.b64') + .action(async ({ bytecodePath, witnessPath, crsPath }) => { + handleGlobalOptions(); + const result = await proveAndVerifyAztecClient(bytecodePath, witnessPath, crsPath); + process.exit(result ? 0 : 1); + }); + program .command('fold_and_verify_program') .description('Accumulate a set of circuits using ClientIvc then verify. Process exits with success or failure code.') diff --git a/barretenberg/ts/yarn.lock b/barretenberg/ts/yarn.lock index 27108df1eec..d375496453c 100644 --- a/barretenberg/ts/yarn.lock +++ b/barretenberg/ts/yarn.lock @@ -27,10 +27,12 @@ __metadata: resolution: "@aztec/bb.js@workspace:." dependencies: "@jest/globals": ^29.4.3 + "@msgpack/msgpack": ^3.0.0-beta2 "@types/debug": ^4.1.7 "@types/detect-node": ^2.0.0 "@types/jest": ^29.4.0 "@types/node": ^18.7.23 + "@types/pako": ^2.0.3 "@types/source-map-support": ^0.5.6 "@typescript-eslint/eslint-plugin": ^5.54.1 "@typescript-eslint/parser": ^5.54.1 @@ -45,6 +47,7 @@ __metadata: html-webpack-plugin: ^5.5.1 idb-keyval: ^6.2.1 jest: ^29.5.0 + pako: ^2.1.0 prettier: ^2.8.4 resolve-typescript-plugin: ^2.0.1 ts-jest: ^29.1.0 @@ -870,6 +873,13 @@ __metadata: languageName: node linkType: hard +"@msgpack/msgpack@npm:^3.0.0-beta2": + version: 3.0.0-beta2 + resolution: "@msgpack/msgpack@npm:3.0.0-beta2" + checksum: d86e5d48146051952d6bea35a6cf733a401cf65ad5614d79689aa48c7076021737ca2c782978dd1b6c0c9c45888b246e379e45ae906179e3a0e8ef4ee6f221c1 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1247,6 +1257,13 @@ __metadata: languageName: node linkType: hard +"@types/pako@npm:^2.0.3": + version: 2.0.3 + resolution: "@types/pako@npm:2.0.3" + checksum: 0746dd5d29eccf5b2e6cceb3ccb093851219e78bd2e2e20d25757e247987139e061e5d4ba37cb5295493f06e3c683c74f8876011cd8a3f3748a09244fbc841d9 + languageName: node + linkType: hard + "@types/qs@npm:*": version: 6.9.10 resolution: "@types/qs@npm:6.9.10" @@ -5407,6 +5424,13 @@ __metadata: languageName: node linkType: hard +"pako@npm:^2.1.0": + version: 2.1.0 + resolution: "pako@npm:2.1.0" + checksum: 71666548644c9a4d056bcaba849ca6fd7242c6cf1af0646d3346f3079a1c7f4a66ffec6f7369ee0dc88f61926c10d6ab05da3e1fca44b83551839e89edd75a3e + languageName: node + linkType: hard + "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" diff --git a/yarn-project/Earthfile b/yarn-project/Earthfile index 98ab740d010..0333fbcec5a 100644 --- a/yarn-project/Earthfile +++ b/yarn-project/Earthfile @@ -51,6 +51,8 @@ build: COPY . . ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true RUN ./bootstrap.sh full + RUN cd ivc-integration && chmod +x run_browser_tests.sh && npx playwright install && npx playwright install-deps + build-dev: FROM +build diff --git a/yarn-project/bb-prover/src/bb/execute.ts b/yarn-project/bb-prover/src/bb/execute.ts index 6c22fca5366..11ef630a42a 100644 --- a/yarn-project/bb-prover/src/bb/execute.ts +++ b/yarn-project/bb-prover/src/bb/execute.ts @@ -226,7 +226,7 @@ export async function executeBbClientIvcProof( const args = ['-o', outputPath, '-b', bytecodeStackPath, '-w', witnessStackPath, '-v']; const timer = new Timer(); const logFunction = (message: string) => { - log(`client ivc proof BB out - ${message}`); + log(`bb - ${message}`); }; const result = await executeBB(pathToBB, 'client_ivc_prove_output_all_msgpack', args, logFunction); diff --git a/yarn-project/ivc-integration/package.json b/yarn-project/ivc-integration/package.json index a666ef9d1f1..0eb7a4c6abf 100644 --- a/yarn-project/ivc-integration/package.json +++ b/yarn-project/ivc-integration/package.json @@ -11,16 +11,20 @@ "./package.local.json" ], "scripts": { - "build": "yarn clean && yarn generate && tsc -b", + "build": "yarn clean && yarn generate && rm -rf dest && webpack && tsc -b", "clean": "rm -rf ./dest .tsbuildinfo src/types artifacts", "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", "formatting:fix:types": "NODE_OPTIONS='--max-old-space-size=8096' run -T eslint --fix ./src/types && run -T prettier -w ./src/types", "generate": "yarn generate:noir-circuits", "generate:noir-circuits": "mkdir -p ./artifacts && cp -r ../../noir-projects/mock-protocol-circuits/target/* ./artifacts && node --no-warnings --loader ts-node/esm src/scripts/generate_declaration_files.ts && node --no-warnings --loader ts-node/esm src/scripts/generate_ts_from_abi.ts && run -T prettier -w ./src/types", - "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests", + "test:non-browser":"NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --testPathIgnorePatterns=browser", + "test:browser": "./run_browser_tests.sh", + "test": "yarn test:non-browser", "codegen": "yarn noir-codegen", - "build:dev": "tsc -b --watch" + "build:dev": "tsc -b --watch", + "build:browser-app": "rm -rf dest && webpack", + "serve": "serve -n -L -p 8080 -c ../serve.mt.json dest" }, "jest": { "moduleNameMapper": { @@ -57,6 +61,7 @@ ] }, "dependencies": { + "@aztec/bb.js": "../../ts", "@aztec/circuits.js": "workspace:^", "@aztec/foundation": "workspace:^", "@aztec/types": "workspace:^", @@ -64,7 +69,11 @@ "@noir-lang/noir_js": "file:../../noir/packages/noir_js", "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi", "@noir-lang/types": "portal:../../noir/packages/types", + "chalk": "^5.3.0", "change-case": "^5.4.4", + "pako": "^2.1.0", + "playwright": "^1.48.2", + "puppeteer": "^22.4.1", "tslib": "^2.4.0" }, "devDependencies": { @@ -72,14 +81,25 @@ "@aztec/simulator": "workspace:^", "@jest/globals": "^29.5.0", "@msgpack/msgpack": "^3.0.0-beta2", + "@playwright/test": "^1.48.2", "@types/jest": "^29.5.0", - "@types/node": "^18.7.23", + "@types/node": "^22.8.1", + "@types/pako": "^2.0.3", + "copy-webpack-plugin": "^12.0.2", + "debug": "^4.3.4", + "html-webpack-plugin": "^5.6.0", "jest": "^29.5.0", "jest-mock-extended": "^4.0.0-beta1", "levelup": "^5.1.1", "memdown": "^6.1.1", + "resolve-typescript-plugin": "^2.0.1", + "serve": "^14.2.1", + "ts-loader": "^9.5.1", "ts-node": "^10.9.1", - "typescript": "^5.0.4" + "typescript": "^5.0.4", + "webpack": "^5.90.3", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.3" }, "files": [ "dest", diff --git a/yarn-project/ivc-integration/package.local.json b/yarn-project/ivc-integration/package.local.json index d496e249715..8625c9c135c 100644 --- a/yarn-project/ivc-integration/package.local.json +++ b/yarn-project/ivc-integration/package.local.json @@ -1,7 +1,10 @@ { "scripts": { - "build": "yarn clean && yarn generate && tsc -b", - "clean": "rm -rf ./dest .tsbuildinfo src/types artifacts" + "build": "yarn clean && yarn generate && rm -rf dest && webpack && tsc -b", + "clean": "rm -rf ./dest .tsbuildinfo src/types artifacts", + "test:non-browser":"NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --testPathIgnorePatterns=browser", + "test:browser": "./run_browser_tests.sh", + "test": "yarn test:non-browser" }, "files": ["dest", "src", "artifacts", "!*.test.*"] } diff --git a/yarn-project/ivc-integration/run_browser_tests.sh b/yarn-project/ivc-integration/run_browser_tests.sh new file mode 100755 index 00000000000..4450c980051 --- /dev/null +++ b/yarn-project/ivc-integration/run_browser_tests.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +PATTERN=${1:-browser} + +# Start the server in the background +yarn webpack serve & +SERVER_PID=$! + +# Wait for the server to be available +until curl -s http://localhost:8080 >/dev/null; do + echo "Waiting for the server to start..." + sleep 1 +done + +# Run Jest tests with NODE_NO_WARNINGS +NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests $PATTERN + +# Kill the server after tests complete +kill $SERVER_PID +echo "Server shut down." diff --git a/yarn-project/ivc-integration/serve.mt.json b/yarn-project/ivc-integration/serve.mt.json new file mode 100644 index 00000000000..9046720908b --- /dev/null +++ b/yarn-project/ivc-integration/serve.mt.json @@ -0,0 +1,17 @@ +{ + "headers": [ + { + "source": "**/*", + "headers": [ + { + "key": "Cross-Origin-Embedder-Policy", + "value": "require-corp" + }, + { + "key": "Cross-Origin-Opener-Policy", + "value": "same-origin" + } + ] + } + ] +} diff --git a/yarn-project/ivc-integration/src/browser_client_ivc_integration.test.ts b/yarn-project/ivc-integration/src/browser_client_ivc_integration.test.ts new file mode 100644 index 00000000000..2c9332bc491 --- /dev/null +++ b/yarn-project/ivc-integration/src/browser_client_ivc_integration.test.ts @@ -0,0 +1,98 @@ +import { jest } from '@jest/globals'; +import chalk from 'chalk'; +import createDebug from 'debug'; +import { + type Browser, + type Page, + chromium, + /* firefox, webkit */ +} from 'playwright'; + +import { + generate3FunctionTestingIVCStack, + generate6FunctionTestingIVCStack, + proveAndVerifyAztecClient, +} from './index.js'; + +/* eslint-disable camelcase */ + +createDebug.enable('*'); +const logger = createDebug('aztec:browser-ivc-test'); + +jest.setTimeout(120_000); + +function formatAndPrintLog(message: string): void { + const parts = message.split('%c'); + if (parts.length === 1) { + logger(parts[0]); + return; + } + if (!parts[0]) { + parts.shift(); + } + const colors = parts[parts.length - 1].split(' color: '); + parts[parts.length - 1] = colors.shift()!; + + let formattedMessage = ''; + for (let i = 0; i < parts.length; i++) { + const colorValue = colors[i]; + + if (colorValue === 'inherit' || !colorValue) { + formattedMessage += parts[i]; + } else if (colorValue.startsWith('#')) { + formattedMessage += chalk.hex(colorValue)(parts[i]); + } else { + formattedMessage += parts[i]; + } + } + + logger(formattedMessage); +} + +describe('Client IVC Integration', () => { + let page: Page; + let browser: Browser; + + beforeAll(async () => { + browser = await chromium.launch({ headless: true }); + const context = await browser.newContext(); + page = await context.newPage(); + page.on('console', msg => formatAndPrintLog(msg.text())); + await page.goto('http://localhost:8080'); + }); + + afterAll(async () => { + await browser.close(); + }); + + // This test will verify a client IVC proof of a simple tx: + // 1. Run a mock app that creates two commitments + // 2. Run the init kernel to process the app run + // 3. Run the tail kernel to finish the client IVC chain. + it('Should generate a verifiable client IVC proof from a simple mock tx via bb.js', async () => { + const [bytecodes, witnessStack] = await generate3FunctionTestingIVCStack(); + + logger(`calling prove and verify...`); + const verifyResult = await proveAndVerifyAztecClient(page, bytecodes, witnessStack); + logger(`generated and verified proof. result: ${verifyResult}`); + + expect(verifyResult).toEqual(true); + }); + + // This test will verify a client IVC proof of a more complex tx: + // 1. Run a mock app that creates two commitments + // 2. Run the init kernel to process the app run + // 3. Run a mock app that reads one of those commitments + // 4. Run the inner kernel to process the second app run + // 5. Run the reset kernel to process the read request emitted by the reader app + // 6. Run the tail kernel to finish the client IVC chain + it('Should generate a verifiable client IVC proof from a simple mock tx via bb.js', async () => { + const [bytecodes, witnessStack] = await generate6FunctionTestingIVCStack(); + + logger(`calling prove and verify...`); + const verifyResult = await proveAndVerifyAztecClient(page, bytecodes, witnessStack); + logger(`generated and verified proof. result: ${verifyResult}`); + + expect(verifyResult).toEqual(true); + }); +}); diff --git a/yarn-project/ivc-integration/src/index.html b/yarn-project/ivc-integration/src/index.html new file mode 100644 index 00000000000..6c1cc8af4a5 --- /dev/null +++ b/yarn-project/ivc-integration/src/index.html @@ -0,0 +1,9 @@ + + + + My Test bb.js App + + + + + diff --git a/yarn-project/ivc-integration/src/index.ts b/yarn-project/ivc-integration/src/index.ts index dac0fd16ea8..17b6a95888f 100644 --- a/yarn-project/ivc-integration/src/index.ts +++ b/yarn-project/ivc-integration/src/index.ts @@ -1,4 +1,7 @@ import { type ForeignCallOutput, Noir } from '@noir-lang/noir_js'; +import createDebug from 'debug'; +import { ungzip } from 'pako'; +import { type Page } from 'playwright'; import MockAppCreatorCircuit from '../artifacts/app_creator.json' assert { type: 'json' }; import MockAppReaderCircuit from '../artifacts/app_reader.json' assert { type: 'json' }; @@ -32,6 +35,11 @@ export { MockPublicKernelCircuit, }; +createDebug.enable('*'); +const logger = createDebug('aztec:ivc-test'); + +/* eslint-disable camelcase */ + export const MOCK_MAX_COMMITMENTS_PER_TX = 4; function foreignCallHandler(): Promise { @@ -119,3 +127,118 @@ export async function witnessGenMockPublicKernelCircuit( publicInputs: returnValue as u8, }; } + +export async function generate3FunctionTestingIVCStack(): Promise<[string[], Uint8Array[]]> { + const tx = { + number_of_calls: '0x1', + }; + + // Witness gen app and kernels + const appWitnessGenResult = await witnessGenCreatorAppMockCircuit({ commitments_to_create: ['0x1', '0x2'] }); + logger('generated app mock circuit witness'); + + const initWitnessGenResult = await witnessGenMockPrivateKernelInitCircuit({ + app_inputs: appWitnessGenResult.publicInputs, + tx, + }); + logger('generated mock private kernel init witness'); + + const tailWitnessGenResult = await witnessGenMockPrivateKernelTailCircuit({ + prev_kernel_public_inputs: initWitnessGenResult.publicInputs, + }); + logger('generated mock private kernel tail witness'); + + // Create client IVC proof + const bytecodes = [ + MockAppCreatorCircuit.bytecode, + MockPrivateKernelInitCircuit.bytecode, + MockPrivateKernelTailCircuit.bytecode, + ]; + const witnessStack = [appWitnessGenResult.witness, initWitnessGenResult.witness, tailWitnessGenResult.witness]; + + return [bytecodes, witnessStack]; +} + +export async function generate6FunctionTestingIVCStack(): Promise<[string[], Uint8Array[]]> { + const tx = { + number_of_calls: '0x2', + }; + // Witness gen app and kernels + const creatorAppWitnessGenResult = await witnessGenCreatorAppMockCircuit({ commitments_to_create: ['0x1', '0x2'] }); + const readerAppWitnessGenResult = await witnessGenReaderAppMockCircuit({ commitments_to_read: ['0x2', '0x0'] }); + + const initWitnessGenResult = await witnessGenMockPrivateKernelInitCircuit({ + app_inputs: creatorAppWitnessGenResult.publicInputs, + tx, + }); + const innerWitnessGenResult = await witnessGenMockPrivateKernelInnerCircuit({ + prev_kernel_public_inputs: initWitnessGenResult.publicInputs, + app_inputs: readerAppWitnessGenResult.publicInputs, + }); + + const resetWitnessGenResult = await witnessGenMockPrivateKernelResetCircuit({ + prev_kernel_public_inputs: innerWitnessGenResult.publicInputs, + commitment_read_hints: [ + '0x1', // Reader reads commitment 0x2, which is at index 1 of the created commitments + MOCK_MAX_COMMITMENTS_PER_TX.toString(), // Pad with no-ops + MOCK_MAX_COMMITMENTS_PER_TX.toString(), + MOCK_MAX_COMMITMENTS_PER_TX.toString(), + ], + }); + + const tailWitnessGenResult = await witnessGenMockPrivateKernelTailCircuit({ + prev_kernel_public_inputs: resetWitnessGenResult.publicInputs, + }); + + // Create client IVC proof + const bytecodes = [ + MockAppCreatorCircuit.bytecode, + MockPrivateKernelInitCircuit.bytecode, + MockAppReaderCircuit.bytecode, + MockPrivateKernelInnerCircuit.bytecode, + MockPrivateKernelResetCircuit.bytecode, + MockPrivateKernelTailCircuit.bytecode, + ]; + const witnessStack = [ + creatorAppWitnessGenResult.witness, + initWitnessGenResult.witness, + readerAppWitnessGenResult.witness, + innerWitnessGenResult.witness, + resetWitnessGenResult.witness, + tailWitnessGenResult.witness, + ]; + + return [bytecodes, witnessStack]; +} + +function base64ToUint8Array(base64: string): Uint8Array { + return Uint8Array.from(atob(base64), c => c.charCodeAt(0)); +} + +export async function proveAndVerifyBrowser(bytecodes: string[], witnessStack: Uint8Array[], threads?: number) { + const { AztecClientBackend } = await import('@aztec/bb.js'); + const preparedBytecodes = bytecodes.map(base64ToUint8Array).map((arr: Uint8Array) => ungzip(arr)); + const backend = new AztecClientBackend(preparedBytecodes, { threads }); + const verified = await backend.proveAndVerify(witnessStack.map((arr: Uint8Array) => ungzip(arr))); + + await backend.destroy(); + return verified; +} + +export async function proveAndVerifyAztecClient( + page: Page, + bytecodes: string[], + witnessStack: Uint8Array[], +): Promise { + const threads = 16; + + const result: boolean = await page.evaluate( + ([acir, witness, numThreads]) => { + (window as any).proveAndVerifyBrowser = proveAndVerifyBrowser; + return (window as any).proveAndVerifyBrowser(acir, witness, numThreads); + }, + [bytecodes, witnessStack, threads], + ); + + return result; +} diff --git a/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts b/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts new file mode 100644 index 00000000000..6f413b19a94 --- /dev/null +++ b/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts @@ -0,0 +1,82 @@ +import { BB_RESULT, executeBbClientIvcProof, verifyClientIvcProof } from '@aztec/bb-prover'; +import { ClientIvcProof } from '@aztec/circuits.js'; +import { createDebugLogger } from '@aztec/foundation/log'; + +import { jest } from '@jest/globals'; +import { encode } from '@msgpack/msgpack'; +import fs from 'fs/promises'; +import os from 'os'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +import { generate3FunctionTestingIVCStack, generate6FunctionTestingIVCStack } from './index.js'; + +/* eslint-disable camelcase */ + +const logger = createDebugLogger('aztec:clientivc-integration'); + +jest.setTimeout(120_000); + +describe('Client IVC Integration', () => { + let bbWorkingDirectory: string; + let bbBinaryPath: string; + + beforeEach(async () => { + // Create a temp working dir + bbWorkingDirectory = await fs.mkdtemp(path.join(os.tmpdir(), 'bb-client-ivc-integration-')); + bbBinaryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../barretenberg/cpp/build/bin', 'bb'); + }); + + async function createClientIvcProof(witnessStack: Uint8Array[], bytecodes: string[]): Promise { + await fs.writeFile( + path.join(bbWorkingDirectory, 'acir.msgpack'), + encode(bytecodes.map(bytecode => Buffer.from(bytecode, 'base64'))), + ); + + await fs.writeFile(path.join(bbWorkingDirectory, 'witnesses.msgpack'), encode(witnessStack)); + const provingResult = await executeBbClientIvcProof( + bbBinaryPath, + bbWorkingDirectory, + path.join(bbWorkingDirectory, 'acir.msgpack'), + path.join(bbWorkingDirectory, 'witnesses.msgpack'), + logger.info, + ); + + if (provingResult.status === BB_RESULT.FAILURE) { + throw new Error(provingResult.reason); + } + + return ClientIvcProof.readFromOutputDirectory(bbWorkingDirectory); + } + + // This test will verify a client IVC proof of a simple tx: + // 1. Run a mock app that creates two commitments + // 2. Run the init kernel to process the app run + // 3. Run the tail kernel to finish the client IVC chain. + it('Should generate a verifiable client IVC proof from a simple mock tx', async () => { + const [bytecodes, witnessStack] = await generate3FunctionTestingIVCStack(); + + const proof = await createClientIvcProof(witnessStack, bytecodes); + await proof.writeToOutputDirectory(bbWorkingDirectory); + const verifyResult = await verifyClientIvcProof(bbBinaryPath, bbWorkingDirectory, logger.info); + + expect(verifyResult.status).toEqual(BB_RESULT.SUCCESS); + }); + + // This test will verify a client IVC proof of a more complex tx: + // 1. Run a mock app that creates two commitments + // 2. Run the init kernel to process the app run + // 3. Run a mock app that reads one of those commitments + // 4. Run the inner kernel to process the second app run + // 5. Run the reset kernel to process the read request emitted by the reader app + // 6. Run the tail kernel to finish the client IVC chain + it('Should generate a verifiable client IVC proof from a complex mock tx', async () => { + const [bytecodes, witnessStack] = await generate6FunctionTestingIVCStack(); + + const proof = await createClientIvcProof(witnessStack, bytecodes); + await proof.writeToOutputDirectory(bbWorkingDirectory); + const verifyResult = await verifyClientIvcProof(bbBinaryPath, bbWorkingDirectory, logger.info); + + expect(verifyResult.status).toEqual(BB_RESULT.SUCCESS); + }); +}); diff --git a/yarn-project/ivc-integration/src/serve.ts b/yarn-project/ivc-integration/src/serve.ts new file mode 100644 index 00000000000..0910e64aae2 --- /dev/null +++ b/yarn-project/ivc-integration/src/serve.ts @@ -0,0 +1,22 @@ +import createDebug from 'debug'; + +import { generate3FunctionTestingIVCStack, proveAndVerifyBrowser } from './index.js'; + +createDebug.enable('*'); +const logger = createDebug('aztec:ivc-test'); + +(window as any).proveAndVerifyBrowser = proveAndVerifyBrowser; + +document.addEventListener('DOMContentLoaded', function () { + const button = document.createElement('button'); + button.innerText = 'Run Test'; + button.addEventListener('click', async () => { + logger(`generating circuit and witness...`); + []; + const [bytecodes, witnessStack] = await generate3FunctionTestingIVCStack(); + logger(`done. proving and verifying...`); + const verified = await proveAndVerifyBrowser(bytecodes, witnessStack); + logger(`verified? ${verified}`); + }); + document.body.appendChild(button); +}); diff --git a/yarn-project/ivc-integration/src/client_ivc_integration.test.ts b/yarn-project/ivc-integration/src/wasm_client_ivc_integration.test.ts similarity index 68% rename from yarn-project/ivc-integration/src/client_ivc_integration.test.ts rename to yarn-project/ivc-integration/src/wasm_client_ivc_integration.test.ts index 1a8409f3588..44c3b7ba234 100644 --- a/yarn-project/ivc-integration/src/client_ivc_integration.test.ts +++ b/yarn-project/ivc-integration/src/wasm_client_ivc_integration.test.ts @@ -1,13 +1,7 @@ -import { BB_RESULT, executeBbClientIvcProof, verifyClientIvcProof } from '@aztec/bb-prover'; -import { ClientIvcProof } from '@aztec/circuits.js'; import { createDebugLogger } from '@aztec/foundation/log'; import { jest } from '@jest/globals'; -import { encode } from '@msgpack/msgpack'; -import fs from 'fs/promises'; -import os from 'os'; -import path from 'path'; -import { fileURLToPath } from 'url'; +import { ungzip } from 'pako'; import { MOCK_MAX_COMMITMENTS_PER_TX, @@ -32,69 +26,72 @@ const logger = createDebugLogger('aztec:clientivc-integration'); jest.setTimeout(120_000); describe('Client IVC Integration', () => { - let bbWorkingDirectory: string; - let bbBinaryPath: string; - - beforeEach(async () => { - // Create a temp working dir - bbWorkingDirectory = await fs.mkdtemp(path.join(os.tmpdir(), 'bb-client-ivc-integration-')); - bbBinaryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../barretenberg/cpp/build/bin', 'bb'); - }); - - async function createClientIvcProof(witnessStack: Uint8Array[], bytecodes: string[]): Promise { - await fs.writeFile( - path.join(bbWorkingDirectory, 'acir.msgpack'), - encode(bytecodes.map(bytecode => Buffer.from(bytecode, 'base64'))), - ); + beforeEach(async () => {}); + + function base64ToUint8Array(base64: string) { + const binaryString = atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes; + } - await fs.writeFile(path.join(bbWorkingDirectory, 'witnesses.msgpack'), encode(witnessStack)); - const provingResult = await executeBbClientIvcProof( - bbBinaryPath, - bbWorkingDirectory, - path.join(bbWorkingDirectory, 'acir.msgpack'), - path.join(bbWorkingDirectory, 'witnesses.msgpack'), - logger.info, + async function proveAndVerifyAztecClient( + witnessStack: Uint8Array[], + bytecodes: string[], + threads?: number, + ): Promise { + const { AztecClientBackend } = await import('@aztec/bb.js'); + const backend = new AztecClientBackend( + bytecodes.map(base64ToUint8Array).map((arr: Uint8Array) => ungzip(arr)), + { threads }, ); - if (provingResult.status === BB_RESULT.FAILURE) { - throw new Error(provingResult.reason); - } - - return ClientIvcProof.readFromOutputDirectory(bbWorkingDirectory); + const verified = await backend.proveAndVerify(witnessStack.map((arr: Uint8Array) => ungzip(arr))); + logger.debug(`finished running proveAndVerify ${verified}`); + await backend.destroy(); + return verified; } // This test will verify a client IVC proof of a simple tx: // 1. Run a mock app that creates two commitments // 2. Run the init kernel to process the app run // 3. Run the tail kernel to finish the client IVC chain. - it('Should generate a verifiable client IVC proof from a simple mock tx', async () => { + it('Should generate a verifiable client IVC proof from a simple mock tx via bb.js', async () => { const tx = { number_of_calls: '0x1', }; // Witness gen app and kernels const appWitnessGenResult = await witnessGenCreatorAppMockCircuit({ commitments_to_create: ['0x1', '0x2'] }); + logger.debug('generated app mock circuit witness'); const initWitnessGenResult = await witnessGenMockPrivateKernelInitCircuit({ app_inputs: appWitnessGenResult.publicInputs, tx, }); + logger.debug('generated mock private kernel init witness'); const tailWitnessGenResult = await witnessGenMockPrivateKernelTailCircuit({ prev_kernel_public_inputs: initWitnessGenResult.publicInputs, }); + logger.debug('generated mock private kernel tail witness'); + // Create client IVC proof const bytecodes = [ MockAppCreatorCircuit.bytecode, MockPrivateKernelInitCircuit.bytecode, MockPrivateKernelTailCircuit.bytecode, ]; + logger.debug('built bytecode array'); const witnessStack = [appWitnessGenResult.witness, initWitnessGenResult.witness, tailWitnessGenResult.witness]; + logger.debug('built witness stack'); - const proof = await createClientIvcProof(witnessStack, bytecodes); - await proof.writeToOutputDirectory(bbWorkingDirectory); - const verifyResult = await verifyClientIvcProof(bbBinaryPath, bbWorkingDirectory, logger.info); + const verifyResult = await proveAndVerifyAztecClient(witnessStack, bytecodes); + logger.debug(`generated and verified proof. result: ${verifyResult}`); - expect(verifyResult.status).toEqual(BB_RESULT.SUCCESS); + expect(verifyResult).toEqual(true); }); // This test will verify a client IVC proof of a more complex tx: @@ -153,10 +150,9 @@ describe('Client IVC Integration', () => { tailWitnessGenResult.witness, ]; - const proof = await createClientIvcProof(witnessStack, bytecodes); - await proof.writeToOutputDirectory(bbWorkingDirectory); - const verifyResult = await verifyClientIvcProof(bbBinaryPath, bbWorkingDirectory, logger.info); + const verifyResult = await proveAndVerifyAztecClient(witnessStack, bytecodes); + logger.debug(`generated and verified proof. result: ${verifyResult}`); - expect(verifyResult.status).toEqual(BB_RESULT.SUCCESS); + expect(verifyResult).toEqual(true); }); }); diff --git a/yarn-project/ivc-integration/webpack.config.js b/yarn-project/ivc-integration/webpack.config.js new file mode 100644 index 00000000000..1747db64168 --- /dev/null +++ b/yarn-project/ivc-integration/webpack.config.js @@ -0,0 +1,45 @@ +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import ResolveTypeScriptPlugin from "resolve-typescript-plugin"; +import CopyWebpackPlugin from "copy-webpack-plugin"; +import HtmlWebpackPlugin from "html-webpack-plugin"; +import webpack from "webpack"; + +export default { + target: "web", + mode: "production", + entry: { + index: "./src/serve.ts", + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: [{ loader: "ts-loader" }], + } + ], + }, + output: { + path: resolve(dirname(fileURLToPath(import.meta.url)), "./dest"), + filename: "[name].js", + chunkFilename: "[name].chunk.js", // This naming pattern is used for chunks produced from code-splitting. + }, + plugins: [ + new HtmlWebpackPlugin({ inject: false, template: "./src/index.html" }), + new webpack.DefinePlugin({ "process.env.NODE_DEBUG": false }), + ], + resolve: { + plugins: [new ResolveTypeScriptPlugin()], + }, + devServer: { + hot: false, + client: { + logging: "none", + overlay: false, + }, + headers: { + "Cross-Origin-Opener-Policy": "same-origin", + "Cross-Origin-Embedder-Policy": "require-corp", + }, + }, +}; diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 3398aa8aaac..335dbacd01c 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -691,6 +691,7 @@ __metadata: resolution: "@aztec/ivc-integration@workspace:ivc-integration" dependencies: "@aztec/bb-prover": "workspace:^" + "@aztec/bb.js": ../../ts "@aztec/circuits.js": "workspace:^" "@aztec/foundation": "workspace:^" "@aztec/simulator": "workspace:^" @@ -701,16 +702,31 @@ __metadata: "@noir-lang/noir_js": "file:../../noir/packages/noir_js" "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi" "@noir-lang/types": "portal:../../noir/packages/types" + "@playwright/test": ^1.48.2 "@types/jest": ^29.5.0 - "@types/node": ^18.7.23 + "@types/node": ^22.8.1 + "@types/pako": ^2.0.3 + chalk: ^5.3.0 change-case: ^5.4.4 + copy-webpack-plugin: ^12.0.2 + debug: ^4.3.4 + html-webpack-plugin: ^5.6.0 jest: ^29.5.0 jest-mock-extended: ^4.0.0-beta1 levelup: ^5.1.1 memdown: ^6.1.1 + pako: ^2.1.0 + playwright: ^1.48.2 + puppeteer: ^22.4.1 + resolve-typescript-plugin: ^2.0.1 + serve: ^14.2.1 + ts-loader: ^9.5.1 ts-node: ^10.9.1 tslib: ^2.4.0 typescript: ^5.0.4 + webpack: ^5.90.3 + webpack-cli: ^5.1.4 + webpack-dev-server: ^5.0.3 languageName: unknown linkType: soft @@ -2648,6 +2664,38 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:^1.1.1": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 00dbf9cbc6ecb3af0e58288a305cc4ee3dfca9efa24443d98061756e8f6de4d6d2d3764bdfde07f2b03e6ce56db27c8a59b490bd134bf3d8122b4c6b394c7010 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.0.3": + version: 1.1.0 + resolution: "@jsonjoy.com/json-pack@npm:1.1.0" + dependencies: + "@jsonjoy.com/base64": ^1.1.1 + "@jsonjoy.com/util": ^1.1.2 + hyperdyperid: ^1.2.0 + thingies: ^1.20.0 + peerDependencies: + tslib: 2 + checksum: 5c89a01814d5a7464639c3cbd4dbbcbf19165e9e6d6cc3cc985f8a7594fc2c5ac3a29e4f49f9ddf029979ec26ab980960a250db044173798509d0ea388c2ae26 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0": + version: 1.5.0 + resolution: "@jsonjoy.com/util@npm:1.5.0" + peerDependencies: + tslib: 2 + checksum: 62892928e1223798e3d910be8dde4fdceaddf2ebdd4bdc0c50495b8ee33503317adf7b5118cd8f5a63045e3f232d70e95fb0279828caf1ec392ffeeb7ea129b8 + languageName: node + linkType: hard + "@koa/cors@npm:^5.0.0": version: 5.0.0 resolution: "@koa/cors@npm:5.0.0" @@ -3876,6 +3924,17 @@ __metadata: languageName: node linkType: hard +"@playwright/test@npm:^1.48.2": + version: 1.48.2 + resolution: "@playwright/test@npm:1.48.2" + dependencies: + playwright: 1.48.2 + bin: + playwright: cli.js + checksum: 926e9411c800bbbf188271fe399f93d2abb1e50aac7844a44a698b3c6dae6f874a3715b1bf6d2f367dd53adb87d9f5d80d03ef71060901a59b6e227d8ed23826 + languageName: node + linkType: hard + "@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": version: 1.1.2 resolution: "@protobufjs/aspromise@npm:1.1.2" @@ -3967,6 +4026,24 @@ __metadata: languageName: node linkType: hard +"@puppeteer/browsers@npm:2.3.0": + version: 2.3.0 + resolution: "@puppeteer/browsers@npm:2.3.0" + dependencies: + debug: ^4.3.5 + extract-zip: ^2.0.1 + progress: ^2.0.3 + proxy-agent: ^6.4.0 + semver: ^7.6.3 + tar-fs: ^3.0.6 + unbzip2-stream: ^1.4.3 + yargs: ^17.7.2 + bin: + browsers: lib/cjs/main-cli.js + checksum: dbfae1f0a3cb5ee07711eb0247d5f61039989094858989cede3f86bfef59224c72df17a1b898266e5ba7c6a7032ab647c59ad3df8f76771ef65d8974a3f93f19 + languageName: node + linkType: hard + "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.4": version: 1.1.6 resolution: "@scure/base@npm:1.1.6" @@ -4030,6 +4107,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/merge-streams@npm:^2.1.0": + version: 2.3.0 + resolution: "@sindresorhus/merge-streams@npm:2.3.0" + checksum: e989d53dee68d7e49b4ac02ae49178d561c461144cea83f66fa91ff012d981ad0ad2340cbd13f2fdb57989197f5c987ca22a74eb56478626f04e79df84291159 + languageName: node + linkType: hard + "@sinonjs/commons@npm:^3.0.0": version: 3.0.1 resolution: "@sinonjs/commons@npm:3.0.1" @@ -4333,6 +4417,15 @@ __metadata: languageName: node linkType: hard +"@types/bonjour@npm:^3.5.13": + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" + dependencies: + "@types/node": "*" + checksum: e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee + languageName: node + linkType: hard + "@types/chalk@npm:^2.2.0": version: 2.2.0 resolution: "@types/chalk@npm:2.2.0" @@ -4342,6 +4435,16 @@ __metadata: languageName: node linkType: hard +"@types/connect-history-api-fallback@npm:^1.5.4": + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" + dependencies: + "@types/express-serve-static-core": "*" + "@types/node": "*" + checksum: e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd + languageName: node + linkType: hard + "@types/connect@npm:*": version: 3.4.38 resolution: "@types/connect@npm:3.4.38" @@ -4411,7 +4514,7 @@ __metadata: languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.3": +"@types/eslint-scope@npm:^3.7.3, @types/eslint-scope@npm:^3.7.7": version: 3.7.7 resolution: "@types/eslint-scope@npm:3.7.7" dependencies: @@ -4438,6 +4541,25 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:*": + version: 5.0.1 + resolution: "@types/express-serve-static-core@npm:5.0.1" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + "@types/send": "*" + checksum: e9daf9bc0d83f593aa2fdcb7c3f9c0a8747bfdf6d8a5ee48ed8d8cc4dc2ed52bdc75d20f6fec9ef00a1aa5ade4c7f16668ff1c020911b50394472844813b1cdb + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.33": version: 4.19.0 resolution: "@types/express-serve-static-core@npm:4.19.0" @@ -4450,7 +4572,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*": +"@types/express@npm:*, @types/express@npm:^4.17.21": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -4481,6 +4603,13 @@ __metadata: languageName: node linkType: hard +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: eb843f6a8d662d44fb18ec61041117734c6aae77aa38df1be3b4712e8e50ffaa35f1e1c92fdd0fde14a5675fecf457abcd0d15a01fae7506c91926176967f452 + languageName: node + linkType: hard + "@types/http-assert@npm:*": version: 1.5.5 resolution: "@types/http-assert@npm:1.5.5" @@ -4495,6 +4624,15 @@ __metadata: languageName: node linkType: hard +"@types/http-proxy@npm:^1.17.8": + version: 1.17.15 + resolution: "@types/http-proxy@npm:1.17.15" + dependencies: + "@types/node": "*" + checksum: d96eaf4e22232b587b46256b89c20525c453216684481015cf50fb385b0b319b883749ccb77dee9af57d107e8440cdacd56f4234f65176d317e9777077ff5bf3 + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" @@ -4530,7 +4668,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -4837,6 +4975,15 @@ __metadata: languageName: node linkType: hard +"@types/node-forge@npm:^1.3.0": + version: 1.3.11 + resolution: "@types/node-forge@npm:1.3.11" + dependencies: + "@types/node": "*" + checksum: 1e86bd55b92a492eaafd75f6d01f31e7d86a5cdadd0c6bcdc0b1df4103b7f99bb75b832efd5217c7ddda5c781095dc086a868e20b9de00f5a427ddad4c296cd5 + languageName: node + linkType: hard + "@types/node@npm:*": version: 20.12.11 resolution: "@types/node@npm:20.12.11" @@ -4873,6 +5020,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.8.1": + version: 22.8.7 + resolution: "@types/node@npm:22.8.7" + dependencies: + undici-types: ~6.19.8 + checksum: c7b200d06da97a4d4f46528ae962c028bb06b6ef9ab7f7949639420f3b3d236f041756ca1945dcaec0fcefbafd07b8ca47bbc1b47b77d33a4173211425641426 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -4880,7 +5036,7 @@ __metadata: languageName: node linkType: hard -"@types/pako@npm:^2.0.0": +"@types/pako@npm:^2.0.0, @types/pako@npm:^2.0.3": version: 2.0.3 resolution: "@types/pako@npm:2.0.3" checksum: 0746dd5d29eccf5b2e6cceb3ccb093851219e78bd2e2e20d25757e247987139e061e5d4ba37cb5295493f06e3c683c74f8876011cd8a3f3748a09244fbc841d9 @@ -4901,6 +5057,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a + languageName: node + linkType: hard + "@types/semver@npm:^7.5.0, @types/semver@npm:^7.5.2": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" @@ -4918,7 +5081,16 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:*": +"@types/serve-index@npm:^1.9.4": + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" + dependencies: + "@types/express": "*" + checksum: 72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 + languageName: node + linkType: hard + +"@types/serve-static@npm:*, @types/serve-static@npm:^1.15.5": version: 1.15.7 resolution: "@types/serve-static@npm:1.15.7" dependencies: @@ -4963,6 +5135,15 @@ __metadata: languageName: node linkType: hard +"@types/sockjs@npm:^0.3.36": + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" + dependencies: + "@types/node": "*" + checksum: b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc + languageName: node + linkType: hard + "@types/source-map-support@npm:^0.5.10": version: 0.5.10 resolution: "@types/source-map-support@npm:0.5.10" @@ -5013,6 +5194,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.5.10": + version: 8.5.13 + resolution: "@types/ws@npm:8.5.13" + dependencies: + "@types/node": "*" + checksum: f17023ce7b89c6124249c90211803a4aaa02886e12bc2d0d2cd47fa665eeb058db4d871ce4397d8e423f6beea97dd56835dd3fdbb921030fe4d887601e37d609 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.4": version: 8.5.10 resolution: "@types/ws@npm:8.5.10" @@ -5457,6 +5647,13 @@ __metadata: languageName: node linkType: hard +"@zeit/schemas@npm:2.36.0": + version: 2.36.0 + resolution: "@zeit/schemas@npm:2.36.0" + checksum: 9a5939a14ffa1e3a2c73ccb7c06b7bbc932baf1012d9191d3df641f26a2c3f7a6f25ea0213aad02a2011602ded3410cbcdc47633ec9ed28400485625b432945f + languageName: node + linkType: hard + "JSONStream@npm:^1.0.3": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -5537,7 +5734,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.5": +"accepts@npm:^1.3.5, accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -5599,6 +5796,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.14.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 + languageName: node + linkType: hard + "acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" @@ -5627,6 +5833,20 @@ __metadata: languageName: node linkType: hard +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + "ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -5636,6 +5856,29 @@ __metadata: languageName: node linkType: hard +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: ^3.1.3 + peerDependencies: + ajv: ^8.8.2 + checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 + languageName: node + linkType: hard + +"ajv@npm:8.12.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + "ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -5648,7 +5891,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.8.2": +"ajv@npm:^8.0.0, ajv@npm:^8.8.2, ajv@npm:^8.9.0": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -5660,6 +5903,15 @@ __metadata: languageName: node linkType: hard +"ansi-align@npm:^3.0.1": + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" + dependencies: + string-width: ^4.1.0 + checksum: 6abfa08f2141d231c257162b15292467081fa49a208593e055c866aa0455b57f3a86b5a678c190c618faa79b4c59e254493099cb700dd9cf2293c6be2c8f5d8d + languageName: node + linkType: hard + "ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -5669,6 +5921,15 @@ __metadata: languageName: node linkType: hard +"ansi-html-community@npm:^0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 04c568e8348a636963f915e48eaa3e01218322e1169acafdd79c384f22e5558c003f79bbc480c1563865497482817c7eed025f0653ebc17642fededa5cb42089 + languageName: node + linkType: hard + "ansi-regex@npm:^2.0.0": version: 2.1.1 resolution: "ansi-regex@npm:2.1.1" @@ -5750,7 +6011,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3": +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -5767,6 +6028,20 @@ __metadata: languageName: node linkType: hard +"arch@npm:^2.2.0": + version: 2.2.0 + resolution: "arch@npm:2.2.0" + checksum: e21b7635029fe8e9cdd5a026f9a6c659103e63fff423834323cdf836a1bb240a72d0c39ca8c470f84643385cf581bd8eda2cad8bf493e27e54bd9783abe9101f + languageName: node + linkType: hard + +"arg@npm:5.0.2": + version: 5.0.2 + resolution: "arg@npm:5.0.2" + checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078 + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -5814,6 +6089,13 @@ __metadata: languageName: node linkType: hard +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b + languageName: node + linkType: hard + "array-includes@npm:^3.1.7": version: 3.1.8 resolution: "array-includes@npm:3.1.8" @@ -6146,6 +6428,13 @@ __metadata: languageName: node linkType: hard +"batch@npm:0.6.1": + version: 0.6.1 + resolution: "batch@npm:0.6.1" + checksum: 61f9934c7378a51dce61b915586191078ef7f1c3eca707fdd58b96ff2ff56d9e0af2bdab66b1462301a73c73374239e6542d9821c0af787f3209a23365d07e7f + languageName: node + linkType: hard + "bcrypto@npm:^5.4.0": version: 5.5.2 resolution: "bcrypto@npm:5.5.2" @@ -6167,6 +6456,13 @@ __metadata: languageName: node linkType: hard +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 + languageName: node + linkType: hard + "bindings@npm:^1.3.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -6208,6 +6504,59 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + 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.13.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 1a35c59a6be8d852b00946330141c4f142c6af0f970faa87f10ad74f1ee7118078056706a05ae3093c54dabca9cd3770fa62a170a85801da1a4324f04381167d + languageName: node + linkType: hard + +"bonjour-service@npm:^1.2.1": + version: 1.2.1 + resolution: "bonjour-service@npm:1.2.1" + dependencies: + fast-deep-equal: ^3.1.3 + multicast-dns: ^7.2.5 + checksum: b65b3e6e3a07e97f2da5806afb76f3946d5a6426b72e849a0236dc3c9d3612fb8c5359ebade4be7eb63f74a37670c53a53be2ff17f4f709811fda77f600eb25b + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 + languageName: node + linkType: hard + +"boxen@npm:7.0.0": + version: 7.0.0 + resolution: "boxen@npm:7.0.0" + dependencies: + ansi-align: ^3.0.1 + camelcase: ^7.0.0 + chalk: ^5.0.1 + cli-boxes: ^3.0.0 + string-width: ^5.1.2 + type-fest: ^2.13.0 + widest-line: ^4.0.1 + wrap-ansi: ^8.0.1 + checksum: b917cf7a168ef3149635a8c02d5c9717d66182348bd27038d85328ad12655151e3324db0f2815253846c33e5f0ddf28b6cd52d56a12b9f88617b7f8f722b946a + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -6236,6 +6585,15 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 + languageName: node + linkType: hard + "brorand@npm:^1.0.1, brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" @@ -6421,6 +6779,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.24.0": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" + dependencies: + caniuse-lite: ^1.0.30001669 + electron-to-chromium: ^1.5.41 + node-releases: ^2.0.18 + update-browserslist-db: ^1.1.1 + bin: + browserslist: cli.js + checksum: cf64085f12132d38638f38937a255edb82c7551b164a98577b055dd79719187a816112f7b97b9739e400c4954cd66479c0d7a843cb816e346f4795dc24fd5d97 + languageName: node + linkType: hard + "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -6504,6 +6876,22 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: ^7.0.0 + checksum: 1d966c8d2dbf4d9d394e53b724ac756c2414c45c01340b37743621f59cc565a435024b394ddcb62b9b335d1c9a31f4640eb648c3fec7f97ee74dc0694c9beb6c + languageName: node + linkType: hard + +"bytes@npm:3.0.0": + version: 3.0.0 + resolution: "bytes@npm:3.0.0" + checksum: a2b386dd8188849a5325f58eef69c3b73c51801c08ffc6963eddc9be244089ba32d19347caf6d145c86f315ae1b1fc7061a32b0c1aa6379e6a719090287ed101 + languageName: node + linkType: hard + "bytes@npm:3.1.2, bytes@npm:^3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -6578,6 +6966,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: ^3.1.2 + tslib: ^2.0.3 + checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 + languageName: node + linkType: hard + "camelcase-keys@npm:^6.2.2": version: 6.2.2 resolution: "camelcase-keys@npm:6.2.2" @@ -6603,6 +7001,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^7.0.0": + version: 7.0.1 + resolution: "camelcase@npm:7.0.1" + checksum: 86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001587": version: 1.0.30001617 resolution: "caniuse-lite@npm:1.0.30001617" @@ -6610,6 +7015,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001677 + resolution: "caniuse-lite@npm:1.0.30001677" + checksum: 34099726620baf4f14fbbe88fec38517208cbe9a47009350b59c7cbbbbd45fcf355afe25d5fa277179660eb0f35f103e68806a07bb33d38bbddb7fde0a4302e4 + languageName: node + linkType: hard + "catering@npm:^2.0.0, catering@npm:^2.1.0": version: 2.1.1 resolution: "catering@npm:2.1.1" @@ -6617,13 +7029,29 @@ __metadata: languageName: node linkType: hard -"chalk@npm:*, chalk@npm:^5.3.0": +"chalk-template@npm:0.4.0": + version: 0.4.0 + resolution: "chalk-template@npm:0.4.0" + dependencies: + chalk: ^4.1.2 + checksum: 6c706802a79a7963cbce18f022b046fe86e438a67843151868852f80ea7346e975a6a9749991601e7e5d3b6a6c4852a04c53dc966a9a3d04031bd0e0ed53c819 + languageName: node + linkType: hard + +"chalk@npm:*, chalk@npm:^5.0.1, chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 languageName: node linkType: hard +"chalk@npm:5.0.1": + version: 5.0.1 + resolution: "chalk@npm:5.0.1" + checksum: 7b45300372b908f0471fbf7389ce2f5de8d85bb949026fd51a1b95b10d0ed32c7ed5aab36dd5e9d2bf3191867909b4404cef75c5f4d2d1daeeacd301dd280b76 + languageName: node + linkType: hard + "chalk@npm:^1.1.3": version: 1.1.3 resolution: "chalk@npm:1.1.3" @@ -6679,6 +7107,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.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 + dependenciesMeta: + fsevents: + optional: true + checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -6706,6 +7153,19 @@ __metadata: languageName: node linkType: hard +"chromium-bidi@npm:0.6.3": + version: 0.6.3 + resolution: "chromium-bidi@npm:0.6.3" + dependencies: + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + peerDependencies: + devtools-protocol: "*" + checksum: 4c96419e8f9cf77340948f89cb388e18fb7621993853448f53b7f532a405c6f594e341ae3d9d5f3e73f27bde142cd6b4a0b5984fe88a7758393f76f6f7974705 + languageName: node + linkType: hard + "ci-info@npm:^3.2.0": version: 3.9.0 resolution: "ci-info@npm:3.9.0" @@ -6730,6 +7190,15 @@ __metadata: languageName: node linkType: hard +"clean-css@npm:^5.2.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: ~0.6.0 + checksum: 941987c14860dd7d346d5cf121a82fd2caf8344160b1565c5387f7ccca4bbcaf885bace961be37c4f4713ce2d8c488dd89483c1add47bb779790edbfdcc79cbc + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -6737,6 +7206,13 @@ __metadata: languageName: node linkType: hard +"cli-boxes@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-boxes@npm:3.0.0" + checksum: 637d84419d293a9eac40a1c8c96a2859e7d98b24a1a317788e13c8f441be052fc899480c6acab3acc82eaf1bccda6b7542d7cdcf5c9c3cc39227175dc098d5b2 + languageName: node + linkType: hard + "cli-cursor@npm:^3.1.0": version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" @@ -6760,6 +7236,17 @@ __metadata: languageName: node linkType: hard +"clipboardy@npm:3.0.0": + version: 3.0.0 + resolution: "clipboardy@npm:3.0.0" + dependencies: + arch: ^2.2.0 + execa: ^5.1.1 + is-wsl: ^2.2.0 + checksum: 2c292acb59705494cbe07d7df7c8becff4f01651514d32ebd80f4aec2d20946d8f3824aac67ecdf2d09ef21fdf0eb24b6a7f033c137ccdceedc4661c54455c94 + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -6874,7 +7361,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.14": +"colorette@npm:^2.0.10, colorette@npm:^2.0.14": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d @@ -6978,7 +7465,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^8.1.0": +"commander@npm:^8.1.0, commander@npm:^8.3.0": version: 8.3.0 resolution: "commander@npm:8.3.0" checksum: 0f82321821fc27b83bd409510bb9deeebcfa799ff0bf5d102128b500b7af22872c0c92cb6a0ebc5a4cf19c6b550fba9cedfa7329d18c6442a625f851377bacf0 @@ -7025,7 +7512,7 @@ __metadata: languageName: node linkType: hard -"compressible@npm:^2.0.18": +"compressible@npm:^2.0.18, compressible@npm:~2.0.16, compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" dependencies: @@ -7034,6 +7521,36 @@ __metadata: languageName: node linkType: hard +"compression@npm:1.7.4": + version: 1.7.4 + resolution: "compression@npm:1.7.4" + 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 + checksum: 35c0f2eb1f28418978615dc1bc02075b34b1568f7f56c62d60f4214d4b7cc00d0f6d282b5f8a954f59872396bd770b6b15ffd8aa94c67d4bce9b8887b906999b + languageName: node + linkType: hard + +"compression@npm:^1.7.4": + version: 1.7.5 + resolution: "compression@npm:1.7.5" + dependencies: + bytes: 3.1.2 + compressible: ~2.0.18 + debug: 2.6.9 + negotiator: ~0.6.4 + on-headers: ~1.0.2 + safe-buffer: 5.2.1 + vary: ~1.1.2 + checksum: d624b5562492518eee82c4f1381ea36f69f1f10b4283bfc2dcafd7d4d7eeed17c3f0e8f2951798594b7064db7ac5a6198df34816bde2d56bb7c75ce1570880e9 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -7105,6 +7622,13 @@ __metadata: languageName: node linkType: hard +"connect-history-api-fallback@npm:^2.0.0": + version: 2.0.0 + resolution: "connect-history-api-fallback@npm:2.0.0" + checksum: dc5368690f4a5c413889792f8df70d5941ca9da44523cde3f87af0745faee5ee16afb8195434550f0504726642734f2683d6c07f8b460f828a12c45fbd4c9a68 + languageName: node + linkType: hard + "console-browserify@npm:^1.1.0": version: 1.2.0 resolution: "console-browserify@npm:1.2.0" @@ -7119,7 +7643,14 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:~0.5.2": +"content-disposition@npm:0.5.2": + version: 0.5.2 + resolution: "content-disposition@npm:0.5.2" + checksum: 298d7da63255a38f7858ee19c7b6aae32b167e911293174b4c1349955e97e78e1d0b0d06c10e229405987275b417cf36ff65cbd4821a98bc9df4e41e9372cde7 + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4, content-disposition@npm:~0.5.2": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -7128,7 +7659,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:^1.0.4": +"content-type@npm:^1.0.4, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 @@ -7170,6 +7701,20 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a + languageName: node + linkType: hard + +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: cec5e425549b3650eb5c3498a9ba3cde0b9cd419e3b36e4b92739d30b4d89e0b678b98c1ddc209ce7cf958cd3215671fd6ac47aec21f10c2a0cc68abd399d8a7 + languageName: node + linkType: hard + "cookiejar@npm:^2.1.4": version: 2.1.4 resolution: "cookiejar@npm:2.1.4" @@ -7194,6 +7739,22 @@ __metadata: languageName: node linkType: hard +"copy-webpack-plugin@npm:^12.0.2": + version: 12.0.2 + resolution: "copy-webpack-plugin@npm:12.0.2" + dependencies: + fast-glob: ^3.3.2 + glob-parent: ^6.0.1 + globby: ^14.0.0 + normalize-path: ^3.0.0 + schema-utils: ^4.2.0 + serialize-javascript: ^6.0.2 + peerDependencies: + webpack: ^5.1.0 + checksum: 98127735336c6db5924688486d3a1854a41835963d0c0b81695b2e3d58c6675164be7d23dee7090b84a56d3c9923175d3d0863ac1942bcc3317d2efc1962b927 + languageName: node + linkType: hard + "core-util-is@npm:^1.0.2, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -7201,7 +7762,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:9.0.0": +"cosmiconfig@npm:9.0.0, cosmiconfig@npm:^9.0.0": version: 9.0.0 resolution: "cosmiconfig@npm:9.0.0" dependencies: @@ -7309,6 +7870,26 @@ __metadata: languageName: node linkType: hard +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: ^1.0.0 + css-what: ^6.0.1 + domhandler: ^4.3.1 + domutils: ^2.8.0 + nth-check: ^2.0.1 + checksum: d6202736839194dd7f910320032e7cfc40372f025e4bf21ca5bf6eb0a33264f322f50ba9c0adc35dadd342d3d6fae5ca244779a4873afbfa76561e343f2058e0 + languageName: node + linkType: hard + +"css-what@npm:^6.0.1": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe + languageName: node + linkType: hard + "d3-array@npm:2, d3-array@npm:^2.2.0, d3-array@npm:^2.3.0": version: 2.12.1 resolution: "d3-array@npm:2.12.1" @@ -7560,6 +8141,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -7581,6 +8171,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.5, debug@npm:^4.3.6": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 + languageName: node + linkType: hard + "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -7638,6 +8240,23 @@ __metadata: languageName: node linkType: hard +"default-browser-id@npm:^5.0.0": + version: 5.0.0 + resolution: "default-browser-id@npm:5.0.0" + checksum: 185bfaecec2c75fa423544af722a3469b20704c8d1942794a86e4364fe7d9e8e9f63241a5b769d61c8151993bc65833a5b959026fa1ccea343b3db0a33aa6deb + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.2.1 + resolution: "default-browser@npm:5.2.1" + dependencies: + bundle-name: ^4.1.0 + default-browser-id: ^5.0.0 + checksum: afab7eff7b7f5f7a94d9114d1ec67273d3fbc539edf8c0f80019879d53aa71e867303c6f6d7cffeb10a6f3cfb59d4f963dba3f9c96830b4540cc7339a1bf9840 + languageName: node + linkType: hard + "defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" @@ -7668,6 +8287,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 54884f94caac0791bf6395a3ec530ce901cf71c47b0196b8754f3fd17edb6c0e80149c1214429d851873bb0d689dbe08dcedbb2306dc45c8534a5934723851b6 + languageName: node + linkType: hard + "define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -7778,7 +8404,7 @@ __metadata: languageName: node linkType: hard -"destroy@npm:^1.0.4": +"destroy@npm:1.2.0, destroy@npm:^1.0.4": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -7799,7 +8425,7 @@ __metadata: languageName: node linkType: hard -"detect-node@npm:^2.1.0": +"detect-node@npm:^2.0.4, detect-node@npm:^2.1.0": version: 2.1.0 resolution: "detect-node@npm:2.1.0" checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e @@ -8011,6 +8637,13 @@ __metadata: languageName: node linkType: hard +"devtools-protocol@npm:0.0.1312386": + version: 0.0.1312386 + resolution: "devtools-protocol@npm:0.0.1312386" + checksum: c6f68bce3257a6f4c832d2063fddf23b76d45f5cdaace83786c24802e12eeead3613abb54e3422e6fa95cab431fdff65ba7caf3665f7f22676df06a206b49e45 + languageName: node + linkType: hard + "dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -8065,7 +8698,7 @@ __metadata: languageName: node linkType: hard -"dns-packet@npm:^5.6.1": +"dns-packet@npm:^5.2.2, dns-packet@npm:^5.6.1": version: 5.6.1 resolution: "dns-packet@npm:5.6.1" dependencies: @@ -8092,6 +8725,26 @@ __metadata: languageName: node linkType: hard +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: ~0.4 + checksum: ea52fe303f5392e48dea563abef0e6fb3a478b8dbe3c599e99bb5d53981c6c38fc4944e56bb92a8ead6bb989d10b7914722ae11febbd2fd0910e33b9fc4aaa77 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.2.0 + entities: ^2.0.0 + checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 + languageName: node + linkType: hard + "domain-browser@npm:^1.2.0": version: 1.2.0 resolution: "domain-browser@npm:1.2.0" @@ -8099,6 +8752,43 @@ __metadata: languageName: node linkType: hard +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: ^2.2.0 + checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa + languageName: node + linkType: hard + +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: ^1.0.1 + domelementtype: ^2.2.0 + domhandler: ^4.2.0 + checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 + languageName: node + linkType: hard + +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + checksum: a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 + languageName: node + linkType: hard + "dotenv@npm:^16.0.3": version: 16.4.5 resolution: "dotenv@npm:16.4.5" @@ -8155,6 +8845,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.41": + version: 1.5.51 + resolution: "electron-to-chromium@npm:1.5.51" + checksum: 51ec624a59f1eda30e2a32c295c8066acdb840c686ed51d3ae0181845fce91b009e2fc3e658578426b65a0eb6a0cd61b071b3c1c974bff684781ae7790b1ed8d + languageName: node + linkType: hard + "elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5": version: 6.5.5 resolution: "elliptic@npm:6.5.5" @@ -8198,13 +8895,20 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:^1.0.2": +"encodeurl@npm:^1.0.2, encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -8233,6 +8937,23 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -8480,7 +9201,14 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:^1.0.3": +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -8788,6 +9516,13 @@ __metadata: languageName: node linkType: hard +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff + languageName: node + linkType: hard + "ethereum-cryptography@npm:^2.1.3": version: 2.1.3 resolution: "ethereum-cryptography@npm:2.1.3" @@ -8854,7 +9589,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": +"execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -8924,6 +9659,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.19.2": + version: 4.21.1 + resolution: "express@npm:4.21.1" + dependencies: + accepts: ~1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: ~1.0.4 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: ~2.0.0 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: ~1.1.2 + on-finished: 2.4.1 + parseurl: ~1.3.3 + path-to-regexp: 0.1.10 + proxy-addr: ~2.0.7 + qs: 6.13.0 + range-parser: ~1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: ~1.6.18 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: 5ac2b26d8aeddda5564fc0907227d29c100f90c0ead2ead9d474dc5108e8fb306c2de2083c4e3ba326e0906466f2b73417dbac16961f4075ff9f03785fd940fe + languageName: node + linkType: hard + "external-editor@npm:^3.1.0": version: 3.1.0 resolution: "external-editor@npm:3.1.0" @@ -8935,7 +9709,7 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:2.0.1": +"extract-zip@npm:2.0.1, extract-zip@npm:^2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" dependencies: @@ -8966,7 +9740,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.1": +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -9023,6 +9797,15 @@ __metadata: languageName: node linkType: hard +"faye-websocket@npm:^0.11.3": + version: 0.11.4 + resolution: "faye-websocket@npm:0.11.4" + dependencies: + websocket-driver: ">=0.5.1" + checksum: d49a62caf027f871149fc2b3f3c7104dc6d62744277eb6f9f36e2d5714e847d846b9f7f0d0b7169b25a012e24a594cde11a93034b30732e4c683f20b8a5019fa + languageName: node + linkType: hard + "fb-watchman@npm:^2.0.0": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" @@ -9112,6 +9895,30 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 + languageName: node + linkType: hard + +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" + dependencies: + debug: 2.6.9 + encodeurl: ~2.0.0 + escape-html: ~1.0.3 + on-finished: 2.4.1 + parseurl: ~1.3.3 + statuses: 2.0.1 + unpipe: ~1.0.0 + checksum: a8c58cd97c9cd47679a870f6833a7b417043f5a288cd6af6d0f49b476c874a506100303a128b6d3b654c3d74fa4ff2ffed68a48a27e8630cda5c918f2977dcf4 + languageName: node + linkType: hard + "find-replace@npm:^3.0.0": version: 3.0.0 resolution: "find-replace@npm:3.0.0" @@ -9234,7 +10041,14 @@ __metadata: languageName: node linkType: hard -"fresh@npm:~0.5.2": +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + languageName: node + linkType: hard + +"fresh@npm:0.5.2, fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 @@ -9295,6 +10109,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -9305,6 +10129,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" @@ -9484,7 +10317,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -9493,7 +10326,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.2": +"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -9578,6 +10411,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:^14.0.0": + version: 14.0.2 + resolution: "globby@npm:14.0.2" + dependencies: + "@sindresorhus/merge-streams": ^2.1.0 + fast-glob: ^3.3.2 + ignore: ^5.2.4 + path-type: ^5.0.0 + slash: ^5.1.0 + unicorn-magic: ^0.1.0 + checksum: 2cee79efefca4383a825fc2fcbdb37e5706728f2d39d4b63851927c128fff62e6334ef7d4d467949d411409ad62767dc2d214e0f837a0f6d4b7290b6711d485c + languageName: node + linkType: hard + "gonzales-pe@npm:^4.2.3, gonzales-pe@npm:^4.3.0": version: 4.3.0 resolution: "gonzales-pe@npm:4.3.0" @@ -9612,6 +10459,13 @@ __metadata: languageName: node linkType: hard +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 68071f313062315cd9dce55710e9496873945f1dd425107007058fc1629f93002a7649fcc3e464281ce02c7e809a35f5925504ab8105d972cf649f1f47cb7d6c + languageName: node + linkType: hard + "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" @@ -9749,6 +10603,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 + languageName: node + linkType: hard + "hexoid@npm:^1.0.0": version: 1.0.0 resolution: "hexoid@npm:1.0.0" @@ -9774,6 +10637,18 @@ __metadata: languageName: node linkType: hard +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" + dependencies: + inherits: ^2.0.1 + obuf: ^1.0.0 + readable-stream: ^2.0.1 + wbuf: ^1.1.0 + checksum: 2de144115197967ad6eeee33faf41096c6ba87078703c5cb011632dcfbffeb45784569e0cf02c317bd79c48375597c8ec88c30fff5bb0b023e8f654fb6e9c06e + languageName: node + linkType: hard + "hsl-to-rgb-for-reals@npm:^1.1.0": version: 1.1.1 resolution: "hsl-to-rgb-for-reals@npm:1.1.1" @@ -9781,6 +10656,13 @@ __metadata: languageName: node linkType: hard +"html-entities@npm:^2.4.0": + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: b23f4a07d33d49ade1994069af4e13d31650e3fb62621e92ae10ecdf01d1a98065c78fd20fdc92b4c7881612210b37c275f2c9fba9777650ab0d6f2ceb3b99b6 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -9788,6 +10670,44 @@ __metadata: languageName: node linkType: hard +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + 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 + checksum: ac52c14006476f773204c198b64838477859dc2879490040efab8979c0207424da55d59df7348153f412efa45a0840a1ca3c757bf14767d23a15e3e389d37a93 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.6.0": + version: 5.6.3 + resolution: "html-webpack-plugin@npm:5.6.3" + 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 + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 59e7d971b0cfd9ba34c7acaa3c161e43c62596474dd8cd35d7b690498ff5891f21296de0aa1d2e7810348caa657e938461267155dda47913b5eeca7124406270 + languageName: node + linkType: hard + "htmlescape@npm:^1.1.0": version: 1.1.1 resolution: "htmlescape@npm:1.1.1" @@ -9795,6 +10715,18 @@ __metadata: languageName: node linkType: hard +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.0.0 + domutils: ^2.5.2 + entities: ^2.0.0 + checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e + languageName: node + linkType: hard + "http-assert@npm:^1.3.0": version: 1.5.0 resolution: "http-assert@npm:1.5.0" @@ -9812,6 +10744,13 @@ __metadata: languageName: node linkType: hard +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 64d7d1ae3a6933eb0e9a94e6f27be4af45a53a96c3c34e84ff57113787105a89fff9d1c3df263ef63add823df019b0e8f52f7121e32393bb5ce9a713bf100b41 + languageName: node + linkType: hard + "http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -9850,6 +10789,13 @@ __metadata: languageName: node linkType: hard +"http-parser-js@npm:>=0.5.1": + version: 0.5.8 + resolution: "http-parser-js@npm:0.5.8" + checksum: 6bbdf2429858e8cf13c62375b0bfb6dc3955ca0f32e58237488bc86cd2378f31d31785fd3ac4ce93f1c74e0189cf8823c91f5cb061696214fd368d2452dc871d + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -9860,6 +10806,24 @@ __metadata: languageName: node linkType: hard +"http-proxy-middleware@npm:^2.0.3": + version: 2.0.7 + resolution: "http-proxy-middleware@npm:2.0.7" + 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 + peerDependencies: + "@types/express": ^4.17.13 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 18caa21145917aa1054740353916e8f03f5a3a93bede9106f1f44d84f7b174df17af1c72bf5fade5cc440c2058ee813f47cbb2bdd6ae6874af1cf33e0ac575f3 + languageName: node + linkType: hard + "http-proxy@npm:^1.18.1": version: 1.18.1 resolution: "http-proxy@npm:1.18.1" @@ -9902,6 +10866,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 210029d1c86926f09109f6317d143f8b056fc38e8dd11b0c3e3205fc6c6ff8429fb55b4b9c2bce065462719ed9d34366eced387aaa0035d93eb76b306a8547ef + languageName: node + linkType: hard + "hyperscript-attribute-to-property@npm:^1.0.0": version: 1.0.2 resolution: "hyperscript-attribute-to-property@npm:1.0.2" @@ -10134,6 +11105,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + languageName: node + linkType: hard + "ipaddr.js@npm:^2.1.0": version: 2.2.0 resolution: "ipaddr.js@npm:2.2.0" @@ -10184,6 +11162,15 @@ __metadata: languageName: node linkType: hard +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + "is-boolean-attribute@npm:0.0.1": version: 0.0.1 resolution: "is-boolean-attribute@npm:0.0.1" @@ -10249,6 +11236,24 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^2.0.0": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 + languageName: node + linkType: hard + +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-electron@npm:^2.2.0": version: 2.2.2 resolution: "is-electron@npm:2.2.2" @@ -10295,7 +11300,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -10304,6 +11309,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: ^3.0.0 + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -10332,8 +11348,15 @@ __metadata: languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 +"is-network-error@npm:^1.0.0": + version: 1.1.0 + resolution: "is-network-error@npm:1.1.0" + checksum: b2fe6aac07f814a9de275efd05934c832c129e7ba292d27614e9e8eec9e043b7a0bbeaeca5d0916b0f462edbec2aa2eaee974ee0a12ac095040e9515c222c251 + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 resolution: "is-number-object@npm:1.0.7" dependencies: has-tostringtag: ^1.0.0 @@ -10376,6 +11399,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c + languageName: node + linkType: hard + "is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -10385,6 +11415,13 @@ __metadata: languageName: node linkType: hard +"is-port-reachable@npm:4.0.0": + version: 4.0.0 + resolution: "is-port-reachable@npm:4.0.0" + checksum: 47b7e10db8edcef27fbf9e50f0de85ad368d35688790ca64a13db67260111ac5f4b98989b11af06199fa93f25d810bd09a5b21b2c2646529668638f7c34d3c04 + languageName: node + linkType: hard + "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -10496,6 +11533,24 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: ^2.0.0 + checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + languageName: node + linkType: hard + +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: ^1.0.0 + checksum: f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -11675,6 +12730,16 @@ __metadata: languageName: node linkType: hard +"launch-editor@npm:^2.6.1": + version: 2.9.1 + resolution: "launch-editor@npm:2.9.1" + dependencies: + picocolors: ^1.0.0 + shell-quote: ^1.8.1 + checksum: bed887085a9729cc2ad050329d92a99f4c69bacccf96d1ed8c84670608a3a128a828ba8e9a8a41101c5aea5aea6f79984658e2fd11f6ba85e32e6e1ed16dbb1c + languageName: node + linkType: hard + "level-concat-iterator@npm:^3.0.0": version: 3.1.0 resolution: "level-concat-iterator@npm:3.1.0" @@ -11967,7 +13032,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": +"lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -12026,6 +13091,15 @@ __metadata: languageName: node linkType: hard +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.1.0, lru-cache@npm:^10.2.0": version: 10.2.2 resolution: "lru-cache@npm:10.2.2" @@ -12233,6 +13307,18 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^4.6.0": + version: 4.14.0 + resolution: "memfs@npm:4.14.0" + dependencies: + "@jsonjoy.com/json-pack": ^1.0.3 + "@jsonjoy.com/util": ^1.3.0 + tree-dump: ^1.0.1 + tslib: ^2.0.0 + checksum: 162e61510983488b0c524bd24191ab8be0f8a95636906ee305c10f2027e6a9f90831f42c072657aaf5fa859bb5132c5e97aa97aa96dfd959810327aec5b067c3 + languageName: node + linkType: hard + "memorystream@npm:^0.3.1": version: 0.3.1 resolution: "memorystream@npm:0.3.1" @@ -12259,6 +13345,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 + languageName: node + linkType: hard + "merge-options@npm:^3.0.4": version: 3.0.4 resolution: "merge-options@npm:3.0.4" @@ -12291,7 +13384,7 @@ __metadata: languageName: node linkType: hard -"methods@npm:^1.1.2": +"methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a @@ -12308,6 +13401,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.2": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 + languageName: node + linkType: hard + "miller-rabin@npm:^4.0.0": version: 4.0.1 resolution: "miller-rabin@npm:4.0.1" @@ -12327,7 +13430,23 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-db@npm:~1.33.0": + version: 1.33.0 + resolution: "mime-db@npm:1.33.0" + checksum: 281a0772187c9b8f6096976cb193ac639c6007ac85acdbb8dc1617ed7b0f4777fa001d1b4f1b634532815e60717c84b2f280201d55677fb850c9d45015b50084 + languageName: node + linkType: hard + +"mime-types@npm:2.1.18": + version: 2.1.18 + resolution: "mime-types@npm:2.1.18" + dependencies: + mime-db: ~1.33.0 + checksum: 729265eff1e5a0e87cb7f869da742a610679585167d2f2ec997a7387fc6aedf8e5cad078e99b0164a927bdf3ace34fca27430d6487456ad090cba5594441ba43 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -12336,6 +13455,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 + languageName: node + linkType: hard + "mime@npm:2.6.0": version: 2.6.0 resolution: "mime@npm:2.6.0" @@ -12380,6 +13508,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + "minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -12389,15 +13526,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - "minimatch@npm:^9.0.0, minimatch@npm:^9.0.1": version: 9.0.4 resolution: "minimatch@npm:9.0.4" @@ -12621,6 +13749,13 @@ __metadata: languageName: node linkType: hard +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -12628,7 +13763,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -12690,6 +13825,18 @@ __metadata: languageName: node linkType: hard +"multicast-dns@npm:^7.2.5": + version: 7.2.5 + resolution: "multicast-dns@npm:7.2.5" + dependencies: + dns-packet: ^5.2.2 + thunky: ^1.0.2 + bin: + multicast-dns: cli.js + checksum: 00b8a57df152d4cd0297946320a94b7c3cdf75a46a2247f32f958a8927dea42958177f9b7fdae69fab2e4e033fb3416881af1f5e9055a3e1542888767139e2fb + languageName: node + linkType: hard + "multiformats@npm:^12.0.1": version: 12.1.3 resolution: "multiformats@npm:12.1.3" @@ -12798,6 +13945,13 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 7ded10aa02a0707d1d12a9973fdb5954f98547ca7beb60e31cb3a403cc6e8f11138db7a3b0128425cf836fc85d145ec4ce983b2bdf83dca436af879c2d683510 + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -12821,6 +13975,16 @@ __metadata: languageName: node linkType: hard +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: ^2.0.2 + tslib: ^2.0.3 + checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + languageName: node + linkType: hard + "node-addon-api@npm:^6.1.0": version: 6.1.0 resolution: "node-addon-api@npm:6.1.0" @@ -12837,7 +14001,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1.1.0": +"node-forge@npm:^1, node-forge@npm:^1.1.0": version: 1.3.1 resolution: "node-forge@npm:1.3.1" checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 @@ -12913,6 +14077,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 + languageName: node + linkType: hard + "node-source-walk@npm:^4.0.0, node-source-walk@npm:^4.2.0, node-source-walk@npm:^4.2.2": version: 4.3.0 resolution: "node-source-walk@npm:4.3.0" @@ -12961,7 +14132,7 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0": +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 @@ -12986,6 +14157,15 @@ __metadata: languageName: node linkType: hard +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: ^1.0.0 + checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 + languageName: node + linkType: hard + "number-is-nan@npm:^1.0.0": version: 1.0.1 resolution: "number-is-nan@npm:1.0.1" @@ -13067,7 +14247,14 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:^2.3.0": +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 41a2ba310e7b6f6c3b905af82c275bf8854896e2e4c5752966d64cbcd2f599cfffd5932006bcf3b8b419dfdacebb3a3912d5d94e10f1d0acab59876c8757f27f + languageName: node + linkType: hard + +"on-finished@npm:2.4.1, on-finished@npm:^2.3.0, on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -13076,6 +14263,13 @@ __metadata: languageName: node linkType: hard +"on-headers@npm:~1.0.2": + version: 1.0.2 + resolution: "on-headers@npm:1.0.2" + checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5 + languageName: node + linkType: hard + "on-net-listen@npm:^1.1.0": version: 1.1.2 resolution: "on-net-listen@npm:1.1.2" @@ -13126,6 +14320,18 @@ __metadata: languageName: node linkType: hard +"open@npm:^10.0.3": + version: 10.1.0 + resolution: "open@npm:10.1.0" + dependencies: + default-browser: ^5.2.1 + define-lazy-prop: ^3.0.0 + is-inside-container: ^1.0.0 + is-wsl: ^3.1.0 + checksum: 079b0771616bac13b08129b0300032dc9328d72f345e460dd0416b8a8196a5bdf5e0251fefec8aa2a6a97c736734ac65dd8f1d29ab3fc9a13e85624aa5bc4470 + languageName: node + linkType: hard + "opn@npm:^5.4.0": version: 5.5.0 resolution: "opn@npm:5.5.0" @@ -13268,6 +14474,17 @@ __metadata: languageName: node linkType: hard +"p-retry@npm:^6.2.0": + version: 6.2.0 + resolution: "p-retry@npm:6.2.0" + dependencies: + "@types/retry": 0.12.2 + is-network-error: ^1.0.0 + retry: ^0.13.1 + checksum: 6003573c559ee812329c9c3ede7ba12a783fdc8dd70602116646e850c920b4597dc502fe001c3f9526fca4e93275045db7a27341c458e51db179c1374a01ac44 + languageName: node + linkType: hard + "p-timeout@npm:^5.0.2": version: 5.1.0 resolution: "p-timeout@npm:5.1.0" @@ -13329,6 +14546,16 @@ __metadata: languageName: node linkType: hard +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -13380,13 +14607,23 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.2": +"parseurl@npm:^1.3.2, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 languageName: node linkType: hard +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e + languageName: node + linkType: hard + "path-browserify@npm:^1.0.0": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" @@ -13408,6 +14645,13 @@ __metadata: languageName: node linkType: hard +"path-is-inside@npm:1.0.2": + version: 1.0.2 + resolution: "path-is-inside@npm:1.0.2" + checksum: 0b5b6c92d3018b82afb1f74fe6de6338c4c654de4a96123cb343f2b747d5606590ac0c890f956ed38220a4ab59baddfd7b713d78a62d240b20b14ab801fa02cb + languageName: node + linkType: hard + "path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -13446,6 +14690,20 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: ab7a3b7a0b914476d44030340b0a65d69851af2a0f33427df1476100ccb87d409c39e2182837a96b98fb38c4ef2ba6b87bdad62bb70a2c153876b8061760583c + languageName: node + linkType: hard + +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: bb249d08804f7961dd44fb175466c900b893c56e909db8e2a66ec12b9d9a964af269eb7a50892c933f52b47315953dfdb4279639fbce20977c3625a9ef3055fe + languageName: node + linkType: hard + "path-to-regexp@npm:^6.2.1": version: 6.2.2 resolution: "path-to-regexp@npm:6.2.2" @@ -13460,6 +14718,13 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^5.0.0": + version: 5.0.0 + resolution: "path-type@npm:5.0.0" + checksum: 15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5 + languageName: node + linkType: hard + "pause-stream@npm:0.0.11": version: 0.0.11 resolution: "pause-stream@npm:0.0.11" @@ -13496,7 +14761,14 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picocolors@npm:^1.1.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf @@ -13519,6 +14791,30 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.48.2": + version: 1.48.2 + resolution: "playwright-core@npm:1.48.2" + bin: + playwright-core: cli.js + checksum: a73ecea379f13f757ec38299871256a130d4abec5688369969a6b1ef6104c67f731a27c9a503a988c3e5b1141048552a3ed8c4d061cb631ff2ebab606835c10a + languageName: node + linkType: hard + +"playwright@npm:1.48.2, playwright@npm:^1.48.2": + version: 1.48.2 + resolution: "playwright@npm:1.48.2" + dependencies: + fsevents: 2.3.2 + playwright-core: 1.48.2 + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 69ffb28b5a94fc21a9bd3439feb363ffebb21c6b00e6d08ffc225787be49005d6b57072ebb043e78378252850f2b7712f8478e6685138a8e445d6fda94a31e28 + languageName: node + linkType: hard + "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -13629,6 +14925,16 @@ __metadata: languageName: node linkType: hard +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: ^4.17.20 + renderkid: ^3.0.0 + checksum: a5b9137365690104ded6947dca2e33360bf55e62a4acd91b1b0d7baa3970e43754c628cc9e16eafbdd4e8f8bcb260a5865475d4fc17c3106ff2d61db4e72cdf3 + languageName: node + linkType: hard + "pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -13703,7 +15009,7 @@ __metadata: languageName: node linkType: hard -"progress@npm:2.0.3": +"progress@npm:2.0.3, progress@npm:^2.0.3": version: 2.0.3 resolution: "progress@npm:2.0.3" checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 @@ -13771,7 +15077,17 @@ __metadata: languageName: node linkType: hard -"proxy-agent@npm:6.4.0": +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 + languageName: node + linkType: hard + +"proxy-agent@npm:6.4.0, proxy-agent@npm:^6.4.0": version: 6.4.0 resolution: "proxy-agent@npm:6.4.0" dependencies: @@ -13854,6 +15170,19 @@ __metadata: languageName: node linkType: hard +"puppeteer-core@npm:22.15.0": + version: 22.15.0 + resolution: "puppeteer-core@npm:22.15.0" + dependencies: + "@puppeteer/browsers": 2.3.0 + chromium-bidi: 0.6.3 + debug: ^4.3.6 + devtools-protocol: 0.0.1312386 + ws: ^8.18.0 + checksum: 68dbc590275d3d2a231bddf6e53c1e352724d159563abe6b6dc8bcff895476e6dc05bdd1bd2ac969c2970ba8aca2adb48128abd50940e701195bc0e655671696 + languageName: node + linkType: hard + "puppeteer-core@npm:22.8.0": version: 22.8.0 resolution: "puppeteer-core@npm:22.8.0" @@ -13881,6 +15210,20 @@ __metadata: languageName: node linkType: hard +"puppeteer@npm:^22.4.1": + version: 22.15.0 + resolution: "puppeteer@npm:22.15.0" + dependencies: + "@puppeteer/browsers": 2.3.0 + cosmiconfig: ^9.0.0 + devtools-protocol: 0.0.1312386 + puppeteer-core: 22.15.0 + bin: + puppeteer: lib/esm/puppeteer/node/cli.js + checksum: 64e9ff78fdd3d848a4404ec1abfd58df987c6fd216b78bc6144a616622c00375bae8cd06f6df8a313b6f2039c95526f4f3de47e907859a65c0b508261ce488f8 + languageName: node + linkType: hard + "pure-rand@npm:^6.0.0": version: 6.1.0 resolution: "pure-rand@npm:6.1.0" @@ -13904,21 +15247,21 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.11.0, qs@npm:^6.5.2": - version: 6.12.1 - resolution: "qs@npm:6.12.1" +"qs@npm:6.13.0, qs@npm:^6.12.3": + version: 6.13.0 + resolution: "qs@npm:6.13.0" dependencies: side-channel: ^1.0.6 - checksum: aa761d99e65b6936ba2dd2187f2d9976afbcda38deb3ff1b3fe331d09b0c578ed79ca2abdde1271164b5be619c521ec7db9b34c23f49a074e5921372d16242d5 + checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 languageName: node linkType: hard -"qs@npm:^6.12.3": - version: 6.13.0 - resolution: "qs@npm:6.13.0" +"qs@npm:^6.11.0, qs@npm:^6.5.2": + version: 6.12.1 + resolution: "qs@npm:6.12.1" dependencies: side-channel: ^1.0.6 - checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 + checksum: aa761d99e65b6936ba2dd2187f2d9976afbcda38deb3ff1b3fe331d09b0c578ed79ca2abdde1271164b5be619c521ec7db9b34c23f49a074e5921372d16242d5 languageName: node linkType: hard @@ -13990,7 +15333,21 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.3.3": +"range-parser@npm:1.2.0": + version: 1.2.0 + resolution: "range-parser@npm:1.2.0" + checksum: bdf397f43fedc15c559d3be69c01dedf38444ca7a1610f5bf5955e3f3da6057a892f34691e7ebdd8c7e1698ce18ef6c4d4811f70e658dda3ff230ef741f8423a + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2, raw-body@npm:^2.3.3": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -14002,7 +15359,7 @@ __metadata: languageName: node linkType: hard -"rc@npm:^1.2.7": +"rc@npm:^1.0.1, rc@npm:^1.1.6, rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -14055,7 +15412,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.2, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -14066,7 +15423,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.8, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.8, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -14094,6 +15451,15 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + "receptacle@npm:^1.3.2": version: 1.3.2 resolution: "receptacle@npm:1.3.2" @@ -14148,6 +15514,45 @@ __metadata: languageName: node linkType: hard +"registry-auth-token@npm:3.3.2": + version: 3.3.2 + resolution: "registry-auth-token@npm:3.3.2" + dependencies: + rc: ^1.1.6 + safe-buffer: ^5.0.1 + checksum: c9d7ae160a738f1fa825556e3669e6c771d2c0239ce37679f7e8646157a97d0a76464738be075002a1f754ef9bfb913b689f4bbfd5296d28f136fbf98c8c2217 + languageName: node + linkType: hard + +"registry-url@npm:3.1.0": + version: 3.1.0 + resolution: "registry-url@npm:3.1.0" + dependencies: + rc: ^1.0.1 + checksum: 6d223da41b04e1824f5faa63905c6f2e43b216589d72794111573f017352b790aef42cd1f826463062f89d804abb2027e3d9665d2a9a0426a11eedd04d470af3 + languageName: node + linkType: hard + +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 5891e792eae1dfc3da91c6fda76d6c3de0333a60aa5ad848982ebb6dccaa06e86385fb1235a1582c680a3d445d31be01c6bfc0804ebbcab5aaf53fa856fde6b6 + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: ^4.1.3 + dom-converter: ^0.2.0 + htmlparser2: ^6.1.0 + lodash: ^4.17.21 + strip-ansi: ^6.0.1 + checksum: 77162b62d6f33ab81f337c39efce0439ff0d1f6d441e29c35183151f83041c7850774fb904da163d6c844264d440d10557714e6daa0b19e4561a5cd4ef305d41 + languageName: node + linkType: hard + "repeat-string@npm:^1.6.1": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" @@ -14324,6 +15729,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -14377,6 +15789,13 @@ __metadata: languageName: node linkType: hard +"run-applescript@npm:^7.0.0": + version: 7.0.0 + resolution: "run-applescript@npm:7.0.0" + checksum: b02462454d8b182ad4117e5d4626e9e6782eb2072925c9fac582170b0627ae3c1ea92ee9b2df7daf84b5e9ffe14eb1cf5fb70bc44b15c8a0bfcdb47987e2410c + languageName: node + linkType: hard + "run-async@npm:^3.0.0": version: 3.0.0 resolution: "run-async@npm:3.0.0" @@ -14414,20 +15833,20 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": +"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c languageName: node linkType: hard +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.3": version: 1.0.3 resolution: "safe-regex-test@npm:1.0.3" @@ -14475,6 +15894,35 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": ^7.0.9 + ajv: ^8.9.0 + ajv-formats: ^2.1.1 + ajv-keywords: ^5.1.0 + checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde + languageName: node + linkType: hard + +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: d7e5fcc695a4804209d232a1b18624a5134be334d4e1114b0721f7a5e72bd73da483dcf41528c1af4f4f4892ad7cfd6a1e55c8ffb83f9c9fe723b738db609dbb + languageName: node + linkType: hard + +"selfsigned@npm:^2.4.1": + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" + dependencies: + "@types/node-forge": ^1.3.0 + node-forge: ^1 + checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa + languageName: node + linkType: hard + "semver-match@npm:0.1.1": version: 0.1.1 resolution: "semver-match@npm:0.1.1" @@ -14531,7 +15979,37 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.1": +"semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 + languageName: node + linkType: hard + +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + 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 + checksum: 5ae11bd900c1c2575525e2aa622e856804e2f96a09281ec1e39610d089f53aa69e13fd8db84b52f001d0318cf4bb0b3b904ad532fc4c0014eb90d32db0cff55f + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" dependencies: @@ -14540,6 +16018,69 @@ __metadata: languageName: node linkType: hard +"serve-handler@npm:6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + checksum: eb26201e699ac4694fb16f9aaf932330f6b1159e9d9496261baa23caf1e81322afcfd2b5f5f2b306b133298c03a8395a3c13b56fde5d70b331014b3a5ab7217f + languageName: node + linkType: hard + +"serve-index@npm:^1.9.1": + version: 1.9.1 + resolution: "serve-index@npm:1.9.1" + 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 + checksum: e2647ce13379485b98a53ba2ea3fbad4d44b57540d00663b02b976e426e6194d62ac465c0d862cb7057f65e0de8ab8a684aa095427a4b8612412eca0d300d22f + languageName: node + linkType: hard + +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: ~2.0.0 + escape-html: ~1.0.3 + parseurl: ~1.3.3 + send: 0.19.0 + checksum: dffc52feb4cc5c68e66d0c7f3c1824d4e989f71050aefc9bd5f822a42c54c9b814f595fc5f2b717f4c7cc05396145f3e90422af31186a93f76cf15f707019759 + languageName: node + linkType: hard + +"serve@npm:^14.2.1": + version: 14.2.4 + resolution: "serve@npm:14.2.4" + dependencies: + "@zeit/schemas": 2.36.0 + ajv: 8.12.0 + arg: 5.0.2 + boxen: 7.0.0 + chalk: 5.0.1 + chalk-template: 0.4.0 + clipboardy: 3.0.0 + compression: 1.7.4 + is-port-reachable: 4.0.0 + serve-handler: 6.1.6 + update-check: 1.5.4 + bin: + serve: build/main.js + checksum: 9d396609214d6d368e95943cd556be76a6918d8522b401115a109fa8e40e1b8740d55cc930b9ee2980540da852c7d54750d00d232b903c88c6471c504c55e62c + languageName: node + linkType: hard + "set-function-length@npm:^1.2.1": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" @@ -14729,6 +16270,13 @@ __metadata: languageName: node linkType: hard +"slash@npm:^5.1.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: 70434b34c50eb21b741d37d455110258c42d2cf18c01e6518aeb7299f3c6e626330c889c0c552b5ca2ef54a8f5a74213ab48895f0640717cacefeef6830a1ba4 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -14736,6 +16284,17 @@ __metadata: languageName: node linkType: hard +"sockjs@npm:^0.3.24": + version: 0.3.24 + resolution: "sockjs@npm:0.3.24" + dependencies: + faye-websocket: ^0.11.3 + uuid: ^8.3.2 + websocket-driver: ^0.7.4 + checksum: 355309b48d2c4e9755349daa29cea1c0d9ee23e49b983841c6bf7a20276b00d3c02343f9f33f26d2ee8b261a5a02961b52a25c8da88b2538c5b68d3071b4934c + languageName: node + linkType: hard + "socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.3": version: 8.0.3 resolution: "socks-proxy-agent@npm:8.0.3" @@ -14758,8 +16317,8 @@ __metadata: linkType: hard "solc@npm:^0.8.27": - version: 0.8.27 - resolution: "solc@npm:0.8.27" + version: 0.8.28 + resolution: "solc@npm:0.8.28" dependencies: command-exists: ^1.2.8 commander: ^8.1.0 @@ -14770,7 +16329,7 @@ __metadata: tmp: 0.0.33 bin: solcjs: solc.js - checksum: 33a81256445b7999672db8b03f94a7a767c28b9be88f60030fbc1b43b5ef9c3fa44591193abe8dda166df333c5fa4370bfcfb67acf01f8ca828ad7fb2f8ce54e + checksum: c22ec95c23505409e83fd7e2c1af47a2b2092d1886c1cf2256b9bc28958963d5bfc9944dc34d0d2e0cbc00975878068b8d87ab7407cec0f9ca5ac57951ee789a languageName: node linkType: hard @@ -14808,7 +16367,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 @@ -14870,6 +16429,33 @@ __metadata: languageName: node linkType: hard +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + 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 + checksum: 0fcaad3b836fb1ec0bdd39fa7008b9a7a84a553f12be6b736a2512613b323207ffc924b9551cef0378f7233c85916cff1118652e03a730bdb97c0e042243d56c + languageName: node + linkType: hard + +"spdy@npm:^4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + 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 + checksum: 2c739d0ff6f56ad36d2d754d0261d5ec358457bea7cbf77b1b05b0c6464f2ce65b85f196305f50b7bd9120723eb94bae9933466f28e67e5cd8cde4e27f1d75f8 + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -15362,7 +16948,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 @@ -15386,6 +16972,23 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^3.0.6": + version: 3.0.6 + resolution: "tar-fs@npm:3.0.6" + dependencies: + bare-fs: ^2.1.1 + bare-path: ^2.1.0 + pump: ^3.0.0 + tar-stream: ^3.1.5 + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: b4fa09c70f75caf05bf5cf87369cd2862f1ac5fb75c4ddf9d25d55999f7736a94b58ad679d384196cba837c5f5ff14086e060fafccef5474a16e2d3058ffa488 + languageName: node + linkType: hard + "tar-stream@npm:^3.1.5": version: 3.1.7 resolution: "tar-stream@npm:3.1.7" @@ -15442,6 +17045,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.10.0": + version: 5.36.0 + resolution: "terser@npm:5.36.0" + 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 + checksum: 489afd31901a2b170f7766948a3aa0e25da0acb41e9e35bd9f9b4751dfa2fc846e485f6fb9d34f0839a96af77f675b5fbf0a20c9aa54e0b8d7c219cf0b55e508 + languageName: node + linkType: hard + "terser@npm:^5.26.0": version: 5.31.0 resolution: "terser@npm:5.31.0" @@ -15481,6 +17098,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^1.20.0": + version: 1.21.0 + resolution: "thingies@npm:1.21.0" + peerDependencies: + tslib: ^2 + checksum: 283a2785e513dc892822dd0bbadaa79e873a7fc90b84798164717bf7cf837553e0b4518d8027b2307d8f6fc6caab088fa717112cd9196c6222763cc3cc1b7e79 + languageName: node + linkType: hard + "through2@npm:^2.0.0, through2@npm:^2.0.3": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -15517,6 +17143,13 @@ __metadata: languageName: node linkType: hard +"thunky@npm:^1.0.2": + version: 1.1.0 + resolution: "thunky@npm:1.1.0" + checksum: 993096c472b6b8f30e29dc777a8d17720e4cab448375041f20c0cb802a09a7fb2217f2a3e8cdc11851faa71c957e2db309357367fc9d7af3cb7a4d00f4b66034 + languageName: node + linkType: hard + "timers-browserify@npm:^1.0.1": version: 1.4.2 resolution: "timers-browserify@npm:1.4.2" @@ -15580,6 +17213,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.1": + version: 1.0.2 + resolution: "tree-dump@npm:1.0.2" + peerDependencies: + tslib: 2 + checksum: 3b0cae6cd74c208da77dac1c65e6a212f5678fe181f1dfffbe05752be188aa88e56d5d5c33f5701d1f603ffcf33403763f722c9e8e398085cde0c0994323cb8d + languageName: node + linkType: hard + "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -15693,7 +17335,7 @@ __metadata: languageName: node linkType: hard -"ts-loader@npm:^9.4.4": +"ts-loader@npm:^9.4.4, ts-loader@npm:^9.5.1": version: 9.5.1 resolution: "ts-loader@npm:9.5.1" dependencies: @@ -15789,6 +17431,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.0.3": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a + languageName: node + linkType: hard + "tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -15879,7 +17528,14 @@ __metadata: languageName: node linkType: hard -"type-is@npm:^1.6.16, type-is@npm:^1.6.18": +"type-fest@npm:^2.13.0": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 + languageName: node + linkType: hard + +"type-is@npm:^1.6.16, type-is@npm:^1.6.18, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -16096,7 +17752,7 @@ __metadata: languageName: node linkType: hard -"unbzip2-stream@npm:1.4.3": +"unbzip2-stream@npm:1.4.3, unbzip2-stream@npm:^1.4.3": version: 1.4.3 resolution: "unbzip2-stream@npm:1.4.3" dependencies: @@ -16135,6 +17791,20 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.8": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 48c5882ca3378f380318c0b4eb1d73b7e3c5b728859b060276e0a490051d4180966beeb48962d850fd0c6816543bcdfc28629dcd030bb62a286a2ae2acb5acb6 + languageName: node + linkType: hard + "uniq@npm:^1.0.1": version: 1.0.1 resolution: "uniq@npm:1.0.1" @@ -16167,7 +17837,7 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:1.0.0": +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 @@ -16195,6 +17865,30 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.1.1": + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" + dependencies: + escalade: ^3.2.0 + picocolors: ^1.1.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e + languageName: node + linkType: hard + +"update-check@npm:1.5.4": + version: 1.5.4 + resolution: "update-check@npm:1.5.4" + dependencies: + registry-auth-token: 3.3.2 + registry-url: 3.1.0 + checksum: 2c9f7de6f030364c5ea02a341e5ae2dfe76da6559b32d40dd3b047b3ac0927408cf92d322c51cd8e009688210a85ccbf1eba449762a65a0d1b14f3cdf1ea5c48 + languageName: node + linkType: hard + "upper-case@npm:^1.1.1": version: 1.1.3 resolution: "upper-case@npm:1.1.3" @@ -16264,6 +17958,29 @@ __metadata: languageName: node linkType: hard +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 97ffd3bd2bb80c773429d3fb8396469115cd190dded1e733f190d8b602bd0a1bcd6216b7ce3c4395ee3c79e3c879c19d268dbaae3093564cb169ad1212d436f4 + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -16292,7 +18009,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1.1.2": +"vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b @@ -16407,6 +18124,15 @@ __metadata: languageName: node linkType: hard +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" + dependencies: + minimalistic-assert: ^1.0.0 + checksum: 2abc306c96930b757972a1c4650eb6b25b5d99f24088714957f88629e137db569368c5de0e57986c89ea70db2f1df9bba11a87cb6d0c8694b6f53a0159fab3bf + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -16455,6 +18181,70 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.2 + resolution: "webpack-dev-middleware@npm:7.4.2" + dependencies: + colorette: ^2.0.10 + memfs: ^4.6.0 + mime-types: ^2.1.31 + on-finished: ^2.4.1 + range-parser: ^1.2.1 + schema-utils: ^4.0.0 + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 39314ec5e4468d177dd61fb51af87ec097e920fe0f0dc101e1bf71796740a7e49fd4f7f939cf91e130232714d6d2fffd948d72dc65dec10f87ac30339929f018 + languageName: node + linkType: hard + +"webpack-dev-server@npm:^5.0.3": + version: 5.1.0 + resolution: "webpack-dev-server@npm:5.1.0" + dependencies: + "@types/bonjour": ^3.5.13 + "@types/connect-history-api-fallback": ^1.5.4 + "@types/express": ^4.17.21 + "@types/serve-index": ^1.9.4 + "@types/serve-static": ^1.15.5 + "@types/sockjs": ^0.3.36 + "@types/ws": ^8.5.10 + ansi-html-community: ^0.0.8 + bonjour-service: ^1.2.1 + chokidar: ^3.6.0 + colorette: ^2.0.10 + compression: ^1.7.4 + connect-history-api-fallback: ^2.0.0 + express: ^4.19.2 + graceful-fs: ^4.2.6 + html-entities: ^2.4.0 + http-proxy-middleware: ^2.0.3 + ipaddr.js: ^2.1.0 + launch-editor: ^2.6.1 + open: ^10.0.3 + p-retry: ^6.2.0 + schema-utils: ^4.2.0 + selfsigned: ^2.4.1 + serve-index: ^1.9.1 + sockjs: ^0.3.24 + spdy: ^4.0.2 + webpack-dev-middleware: ^7.4.2 + ws: ^8.18.0 + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 3128fffeb76b97cc4c506607f81bb644437f6961cf310915e22ecaf79a45c185893d7fc8e1844183fb44827061ec2f3d321e937840f02d4989959a09551a8e35 + languageName: node + linkType: hard + "webpack-merge@npm:^5.7.3": version: 5.10.0 resolution: "webpack-merge@npm:5.10.0" @@ -16510,6 +18300,60 @@ __metadata: languageName: node linkType: hard +"webpack@npm:^5.90.3": + version: 5.96.1 + resolution: "webpack@npm:5.96.1" + dependencies: + "@types/eslint-scope": ^3.7.7 + "@types/estree": ^1.0.6 + "@webassemblyjs/ast": ^1.12.1 + "@webassemblyjs/wasm-edit": ^1.12.1 + "@webassemblyjs/wasm-parser": ^1.12.1 + acorn: ^8.14.0 + browserslist: ^4.24.0 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.17.1 + 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.11 + 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.1 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: ec3662f64895fae408440a997f87299e374c9d9f911f77b880bab46402f52221c7836bdf101fc2556338d07fc7cb86da50661f944eb1d1041a8361a5b9247876 + languageName: node + linkType: hard + +"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": + version: 0.7.4 + resolution: "websocket-driver@npm:0.7.4" + dependencies: + http-parser-js: ">=0.5.1" + safe-buffer: ">=5.1.0" + websocket-extensions: ">=0.1.1" + checksum: fffe5a33fe8eceafd21d2a065661d09e38b93877eae1de6ab5d7d2734c6ed243973beae10ae48c6613cfd675f200e5a058d1e3531bc9e6c5d4f1396ff1f0bfb9 + languageName: node + linkType: hard + +"websocket-extensions@npm:>=0.1.1": + version: 0.1.4 + resolution: "websocket-extensions@npm:0.1.4" + checksum: 5976835e68a86afcd64c7a9762ed85f2f27d48c488c707e67ba85e717b90fa066b98ab33c744d64255c9622d349eedecf728e65a5f921da71b58d0e9591b9038 + languageName: node + linkType: hard + "wherearewe@npm:^2.0.1": version: 2.0.1 resolution: "wherearewe@npm:2.0.1" @@ -16567,6 +18411,15 @@ __metadata: languageName: node linkType: hard +"widest-line@npm:^4.0.1": + version: 4.0.1 + resolution: "widest-line@npm:4.0.1" + dependencies: + string-width: ^5.0.1 + checksum: 64c48cf27171221be5f86fc54b94dd29879165bdff1a7aa92dde723d9a8c99fb108312768a5d62c8c2b80b701fa27bbd36a1ddc58367585cd45c0db7920a0cba + languageName: node + linkType: hard + "wildcard@npm:^2.0.0": version: 2.0.1 resolution: "wildcard@npm:2.0.1" @@ -16668,7 +18521,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^8.1.0": +"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" dependencies: @@ -16726,6 +18579,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + languageName: node + linkType: hard + "xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:^4.0.2, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -16840,7 +18708,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.23.8": +"zod@npm:3.23.8, zod@npm:^3.23.8": version: 3.23.8 resolution: "zod@npm:3.23.8" checksum: 15949ff82118f59c893dacd9d3c766d02b6fa2e71cf474d5aa888570c469dbf5446ac5ad562bb035bf7ac9650da94f290655c194f4a6de3e766f43febd432c5c